home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / comm / dnet / dnet_213 / part04 < prev    next >
Text File  |  1990-03-27  |  62KB  |  2,812 lines

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i121: DNet 2.13 - multiple windows/file transfers over a serial line, Part04/08
  5. Message-ID: <11941@xanth.cs.odu.edu>
  6. Date: 27 Mar 90 01:20:29 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: dales%teksce.sce.tek.com@RELAY.CS.NET
  9. Lines: 2798
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12. X-Post-Discussions-To: comp.sys.amiga
  13.  
  14. Submitted-by: dales%teksce.sce.tek.com@RELAY.CS.NET
  15. Posting-number: Volume 90, Issue 121
  16. Archive-name: comm/dnet/dnet-2.13/part04
  17.  
  18. #!/bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 4 (of 8)."
  25. # Contents:  amiga/client/loadav.c amiga/dnet/packet.c
  26. #   amiga/server/sterm.c unix/client/getfiles.c unix/dnet/dnet.c
  27. #   unix/dnet/dnet.h unix/dnet/packet.c unix/lib/dnetlib.c
  28. # Wrapped by tadguy@xanth on Mon Mar 26 20:15:13 1990
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'amiga/client/loadav.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'amiga/client/loadav.c'\"
  32. else
  33. echo shar: Extracting \"'amiga/client/loadav.c'\" \(6227 characters\)
  34. sed "s/^X//" >'amiga/client/loadav.c' <<'END_OF_FILE'
  35. X
  36. X/*
  37. X *  LOADAV.C
  38. X *
  39. X *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  40. X *
  41. X *  LOADAV  [frequency]     Connect to remote UNIX system and display
  42. X *                load average.  Default is every 5 minutes.
  43. X *
  44. X *  frequency in seconds, default is every 60 seconds
  45. X *
  46. X */
  47. X
  48. X#include "defs.h"
  49. X#include <local/deemu.h>
  50. X
  51. Xint __stdargs CXBRK(void);
  52. X
  53. Xshort Deemu[] = {
  54. X    DMSTRT, 0, 0,
  55. X    DMNW  , 0, 10, 2, 2, -80, 40, 0xFFFF,
  56. X    DMEND , 0, 0
  57. X};
  58. X
  59. X#define DMNWOFF 4
  60. X
  61. X#define NA  0
  62. X#define GWIDTH    (sizeof(Graph)/sizeof(Graph[0]))
  63. X#define GDEPTH    (sizeof(GMap)/sizeof(GMap[0]))
  64. X#define GMASK    (GWIDTH-1)
  65. X
  66. Xuword    GMax[] = { 2*256, 50 };
  67. Xuword    GIncr[]= { 2*256, 20 };
  68. Xuword    GMap[2] = { 0, 1 };
  69. Xuword    Graph[1024][GDEPTH];    /*  5Min,#users.       */
  70. Xuword    Gi;
  71. X
  72. Xubyte    Scr[128];
  73. Xubyte    Initial;
  74. X
  75. Xubyte Title[128];
  76. X
  77. Xextern void updatewindow();
  78. X
  79. XNW Nw = {
  80. X    0, 0, 320, 50, -1, -1,
  81. X    NEWSIZE|CLOSEWINDOW,
  82. X    WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|NOCAREREFRESH,
  83. X    NULL, NULL, Title, NULL, NULL,
  84. X    32, 18, -1, -1, WBENCHSCREEN
  85. X};
  86. X
  87. XWIN *Win;
  88. XRP  *Rp;
  89. X
  90. Xextern int Enable_Abort;
  91. X
  92. Xstruct IntuitionBase *IntuitionBase;
  93. Xstruct GfxBase *GfxBase;
  94. X
  95. Xvoid clearwindow ARGS((void));
  96. Xvoid updatewindow ARGS((char *));
  97. Xvoid main ARGS((int, char **));
  98. X
  99. Xint
  100. Xbrk()
  101. X{
  102. X    return(0);
  103. X}
  104. X
  105. Xvoid
  106. Xmain(ac,av)
  107. Xchar *av[];
  108. X{
  109. X    void *chan = NULL;
  110. X    short numsecs = 60;
  111. X    long imask, tmask, dmask, mask;
  112. X    char notdone = 1;
  113. X    char *host = NULL;
  114. X    PORT *TimPort = CreatePort(NULL, 0);
  115. X    IOT Iot;
  116. X
  117. X    onbreak(brk);
  118. X    sprintf(Title, "LoadAv V%s%s", VERSION, LOADAV_VERSION);
  119. X    {
  120. X    short i;
  121. X    for (i = 1; i < ac; ++i) {
  122. X        if (strncmp(av[i], "-N", 2) == 0) {
  123. X        host = av[i]+2;
  124. X        continue;
  125. X        }
  126. X        numsecs = atoi(av[i]);
  127. X    }
  128. X    }
  129. X
  130. X
  131. X    Iot.tr_node.io_Device = NULL;
  132. X
  133. X    if (OpenDevice("timer.device", UNIT_VBLANK, (IOR *)&Iot, 0))
  134. X    goto fail;
  135. X    Iot.tr_node.io_Command = TR_ADDREQUEST;
  136. X    Iot.tr_node.io_Message.mn_ReplyPort = TimPort;
  137. X    Iot.tr_time.tv_micro = 1;
  138. X    Iot.tr_time.tv_secs  = 0;
  139. X    SendIO((IOR *)&Iot);
  140. X
  141. X#ifndef LATTICE
  142. X    Enable_Abort = 0;
  143. X#endif
  144. X    IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0);
  145. X    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0);
  146. X
  147. X    chan = DOpen(host, PORT_LOADAV, 25, 25);
  148. X    if (chan == NULL) {
  149. X    puts("no connect");
  150. X    goto fail;
  151. X    }
  152. X    InitDeemuNW(Deemu+DMNWOFF, &Nw);
  153. X    Win = OpenWindow(&Nw);
  154. X    if (Win == NULL) {
  155. X    puts("Unable to open window");
  156. X    goto fail;
  157. X    }
  158. X    Rp = Win->RPort;
  159. X    imask   = 1 << Win->UserPort->mp_SigBit;
  160. X    dmask   = 1 << ((PORT *)chan)->mp_SigBit;
  161. X    tmask   = 1 << TimPort->mp_SigBit;
  162. X
  163. X    clearwindow();
  164. X    while (notdone) {
  165. X    mask = Wait(imask|dmask|tmask|SIGBREAKF_CTRL_C);
  166. X    if (mask & SIGBREAKF_CTRL_C)
  167. X        notdone = 0;
  168. X    if (mask & imask) {
  169. X        IMESS *im;
  170. X        while (im = (IMESS *)GetMsg(Win->UserPort)) {
  171. X        switch(im->Class) {
  172. X        case NEWSIZE:
  173. X            clearwindow();
  174. X            break;
  175. X        case CLOSEWINDOW:
  176. X            notdone = 0;
  177. X            break;
  178. X        }
  179. X        ReplyMsg((MSG *)im);
  180. X        }
  181. X    }
  182. X    if (mask & dmask) {
  183. X        char dummy;
  184. X        if ((dummy = DNRead(chan, &dummy, 1)) != 0)
  185. X        notdone = 0;
  186. X    }
  187. X    while (mask & tmask) {      /*  while just so we can break */
  188. X        char len = 0;
  189. X
  190. X        if (GetMsg(TimPort)) {
  191. X        Iot.tr_time.tv_micro = 0;
  192. X        Iot.tr_time.tv_secs  = numsecs;
  193. X        SendIO((IOR *)&Iot);
  194. X        if (DWrite(chan, &len, 1) == 1 && DRead(chan, &len, 1) == 1) {
  195. X            if (len < sizeof(Title) && DRead(chan, Title, len) == len) {
  196. X            Title[len] = 0;
  197. X            updatewindow(Title);
  198. X            SetWindowTitles(Win, Title, (char *)-1);
  199. X            break;
  200. X            }
  201. X        }
  202. X        notdone = 0;
  203. X        }
  204. X        break;
  205. X    }
  206. X    }
  207. X
  208. Xfail:
  209. X    if (Iot.tr_node.io_Device) {
  210. X    AbortIO((IOR *)&Iot);
  211. X    WaitIO((IOR *)&Iot);
  212. X    CloseDevice((IOR *)&Iot);
  213. X    }
  214. X    DeletePort(TimPort);
  215. X    if (Win)
  216. X    CloseWindow(Win);
  217. X    if (chan)
  218. X    DClose(chan);
  219. X    if (IntuitionBase)
  220. X    CloseLibrary((LIB *)IntuitionBase);
  221. X    if (GfxBase)
  222. X    CloseLibrary((LIB *)GfxBase);
  223. X}
  224. X
  225. X/*
  226. X *  Graphics routines.    ************************************************
  227. X */
  228. X
  229. Xshort WOx, WOy, Ww, Wh;
  230. X
  231. Xvoid
  232. Xclearwindow()
  233. X{
  234. X    short i, j, d;
  235. X
  236. X    WOx = Win->BorderLeft;
  237. X    WOy = Win->BorderTop;
  238. X    Ww    = Win->Width - Win->BorderRight - Win->BorderLeft;
  239. X    Wh    = Win->Height- Win->BorderTop    - Win->BorderBottom;
  240. X
  241. X    SetAPen(Rp, 0);
  242. X    RectFill(Rp, WOx, WOy, Ww + WOx, Wh + WOy);
  243. X    WOx += 2;
  244. X    WOy += 2;
  245. X    Ww    -= 4;
  246. X    Wh    -= 4;
  247. X
  248. X    /*
  249. X     *    Redraw the graph.  Scale values relative to GMax[?] and Wh.
  250. X     *
  251. X     *    ypos = (WOy + Wh) - (Wh * value / GMax[d])
  252. X     *
  253. X     */
  254. X
  255. X    for (d = 0; d < GDEPTH; ++d) {
  256. X    char move = 1;
  257. X    SetAPen(Rp, (d & 1) ? 3 : 1);
  258. X    for (i = Ww - 1, j = Gi - 1; i >= 0; --i, --j) {
  259. X        uword value = Wh * Graph[j&GMASK][d] / GMax[GMap[d]];
  260. X        (move) ?
  261. X        Move(Rp, WOx + i, WOy + Wh - value - 1) :
  262. X        Draw(Rp, WOx + i, WOy + Wh - value - 1)
  263. X        ;
  264. X        move = 0;
  265. X    }
  266. X    }
  267. X}
  268. X
  269. X/*
  270. X *  5:44pm up 2 days, 22:30, 37 users, load average: 5.98, 7.93, 7.97
  271. X *              7 mins,
  272. X */
  273. X
  274. Xvoid
  275. Xupdatewindow(str)
  276. Xchar *str;
  277. X{
  278. X    short d;
  279. X    char refresh = 0;
  280. X    uword ary[GDEPTH];
  281. X
  282. X    {
  283. X    long nusers, i1, f1, i5, f5;
  284. X    char *ptr = str;
  285. X
  286. X    while (strncmp(ptr, "users", 5) && *ptr)
  287. X        ++ptr;
  288. X    while (*--ptr == ' ' && ptr != str)
  289. X        --ptr;
  290. X    while (*--ptr != ' ' && ptr != str)
  291. X        --ptr;
  292. X    nusers = atoi(ptr+1);
  293. X    while (strncmp(ptr, "load", 4) && *ptr)
  294. X        ++ptr;
  295. X    sscanf(ptr, "load average: %ld.%ld, %ld.%ld,",
  296. X        &i1, &f1, &i5, &f5
  297. X    );
  298. X    /*
  299. X    ary[0] = (i1 << 8) | ((f1 << 8) / 100);
  300. X    */
  301. X    ary[0] = (i5 << 8) | ((f5 << 8) / 100);
  302. X    ary[1] = nusers;
  303. X    }
  304. X    for (d = 0; d < GDEPTH; ++d) {
  305. X    while (ary[d] > GMax[GMap[d]] && ary[d] < 65000) {
  306. X        GMax[GMap[d]] += GIncr[GMap[d]];
  307. X        refresh = 1;
  308. X    }
  309. X    Graph[Gi][d] = ary[d];
  310. X    }
  311. X    if (!Initial) {
  312. X    short i;
  313. X    Initial = 1;
  314. X    for (i = 0; i < GWIDTH; ++i) {
  315. X        for (d = 0; d < GDEPTH; ++d)
  316. X        Graph[i][d] = Graph[Gi][d];
  317. X    }
  318. X    }
  319. X    Gi = (Gi + 1) & GMASK;
  320. X    if (refresh) {
  321. X    clearwindow();
  322. X    return;
  323. X    }
  324. X    ScrollRaster(Rp, 1, 0, WOx, WOy, WOx + Ww - 1, WOy + Wh - 1);
  325. X    for (d = 0; d < GDEPTH; ++d) {
  326. X    uword value1 = Wh * Graph[(Gi-2)&GMASK][d] / GMax[GMap[d]];
  327. X    uword value2 = Wh * Graph[(Gi-1)&GMASK][d] / GMax[GMap[d]];
  328. X    SetAPen(Rp, (d & 1) ? 3 : 1);
  329. X    Move(Rp, Ww + WOx - 2, WOy + Wh - value1 - 1);
  330. X    Draw(Rp, Ww + WOx - 1, WOy + Wh - value2 - 1);
  331. X    }
  332. X}
  333. X
  334. END_OF_FILE
  335. if test 6227 -ne `wc -c <'amiga/client/loadav.c'`; then
  336.     echo shar: \"'amiga/client/loadav.c'\" unpacked with wrong size!
  337. fi
  338. # end of 'amiga/client/loadav.c'
  339. fi
  340. if test -f 'amiga/dnet/packet.c' -a "${1}" != "-c" ; then 
  341.   echo shar: Will not clobber existing file \"'amiga/dnet/packet.c'\"
  342. else
  343. echo shar: Extracting \"'amiga/dnet/packet.c'\" \(6237 characters\)
  344. sed "s/^X//" >'amiga/dnet/packet.c' <<'END_OF_FILE'
  345. X
  346. X/*
  347. X *  PACKET.C
  348. X */
  349. X
  350. X#include "dnet.h"
  351. X
  352. Xvoid BuildPacket();
  353. X
  354. X#define Ascize(foo) (((foo) & 0x3F) | 0x40)
  355. X
  356. Xubyte    RxTmp[MAXPACKET];
  357. X
  358. Xvoid
  359. XBuildDataPacket(pkt, win, dbuf, actlen)
  360. XPKT    *pkt;
  361. Xubyte    win;
  362. Xubyte    *dbuf;
  363. Xuword    actlen;
  364. X{
  365. X    ubyte *ptr;
  366. X    ubyte *pend;
  367. X    ubyte range = 0;
  368. X    static ubyte BadCtl[32] = {
  369. X    1, 1, 1, 1, 1, 1, 1, 1,
  370. X    1, 1, 1, 1, 1, 1, 1, 1,
  371. X    1, 1, 1, 1, 1, 1, 1, 1,
  372. X    1, 1, 1, 1, 1, 1, 1, 1
  373. X    };
  374. X
  375. X    ptr = dbuf;
  376. X    pend= dbuf + actlen;
  377. X
  378. X    while (ptr < pend) {
  379. X    if (*ptr < 0x20 && BadCtl[*ptr])
  380. X        range |= 1;
  381. X    if (*ptr >= 0x80)
  382. X        range |= 2;
  383. X    ++ptr;
  384. X    }
  385. X    if (Mode7 && range) {
  386. X    uword buflen = Expand6(dbuf, pkt->data, actlen);
  387. X    BuildPacket(pkt, PKCMD_WRITE6, win, pkt->data, actlen, buflen);
  388. X    } else {
  389. X    if (Mode7 || (range & 2)) {
  390. X        BuildPacket(pkt, PKCMD_WRITE, win, dbuf, actlen, actlen);
  391. X    } else {
  392. X        uword buflen = Compress7(dbuf, pkt->data, actlen);
  393. X        BuildPacket(pkt, PKCMD_WRITE7, win, pkt->data, actlen, buflen);
  394. X    }
  395. X    }
  396. X}
  397. X
  398. XPKT *
  399. XBuildRestartAckPacket(dbuf, bytes)
  400. Xubyte *dbuf;
  401. Xubyte bytes;
  402. X{
  403. X    static PKT pkt;
  404. X    BuildPacket(&pkt, PKCMD_ACKRSTART, 0, dbuf, bytes, bytes);
  405. X    return(&pkt);
  406. X}
  407. X
  408. Xvoid
  409. XBuildPacket(pkt, ctl, win, dbuf, actlen, buflen)
  410. XPKT    *pkt;
  411. Xubyte    ctl;
  412. Xubyte    *dbuf;
  413. Xuword    actlen;
  414. Xuword    buflen;
  415. X{
  416. X    pkt->buflen = buflen;
  417. X    pkt->sync = SYNC;
  418. X    pkt->ctl = ctl | win;
  419. X    pkt->cchk = Ascize((pkt->sync << 1) ^ pkt->ctl);
  420. X    if (actlen) {
  421. X    uword chk = chkbuf(dbuf, buflen);
  422. X    ubyte dchkh = chk >> 8;
  423. X    ubyte dchkl = chk;
  424. X
  425. X    pkt->lenh = Ascize(actlen >> 6);
  426. X    pkt->lenl = Ascize(actlen);
  427. X    pkt->dchkh= Ascize(dchkh);
  428. X    pkt->dchkl= Ascize(dchkl);
  429. X    if (dbuf != pkt->data)
  430. X        BMov(dbuf, pkt->data, buflen);
  431. X    }
  432. X}
  433. X
  434. Xvoid
  435. XWritePacket(pkt)
  436. XPKT *pkt;
  437. X{
  438. X    if (DDebug)
  439. X    printf("SEND-PACKET %02x %d\n", pkt->ctl, pkt->buflen);
  440. X
  441. X    switch(pkt->ctl & PKF_MASK) {
  442. X    case PKCMD_WRITE:
  443. X    ++Packets8Out;
  444. X    break;
  445. X    case PKCMD_WRITE6:
  446. X    ++Packets6Out;
  447. X    break;
  448. X    case PKCMD_WRITE7:
  449. X    ++Packets7Out;
  450. X    break;
  451. X    }
  452. X
  453. X    if (pkt->buflen)
  454. X    NetWrite(&pkt->sync, 7 + pkt->buflen);
  455. X    else
  456. X    NetWrite(&pkt->sync, 3);
  457. X}
  458. X
  459. Xvoid
  460. XWriteCtlPacket(ctl, win)
  461. X{
  462. X    static CTLPKT pkt;
  463. X
  464. X    NetWrite(NULL, 0);
  465. X    BuildPacket(&pkt, ctl, win, NULL, 0, 0);
  466. X    WritePacket(&pkt);
  467. X}
  468. X
  469. Xvoid
  470. XWriteNak(win)
  471. X{
  472. X    WriteCtlPacket(PKCMD_NAK, win);
  473. X}
  474. X
  475. Xvoid
  476. XWriteAck(win)
  477. X{
  478. X    WriteCtlPacket(PKCMD_ACK, win);
  479. X}
  480. X
  481. Xvoid
  482. XWriteChk(win)
  483. X{
  484. X    WriteCtlPacket(PKCMD_CHECK, win);
  485. X}
  486. X
  487. Xvoid
  488. XWriteRestart()
  489. X{
  490. X    WriteCtlPacket(PKCMD_RESTART, 0);
  491. X}
  492. X
  493. X/*
  494. X *    RECEIVE A PACKET
  495. X */
  496. X
  497. Xint
  498. XRecvPacket(ptr, len)
  499. Xubyte *ptr;
  500. Xlong len;
  501. X{
  502. X    static uword ActLen;    /*    actual # bytes after decoding */
  503. X    static uword BufLen;    /*    length of input data buffer   */
  504. X    static uword DBLen;     /*    # bytes already in i.d.buf    */
  505. X    static ubyte RState;
  506. X    static PKT     Pkt;
  507. X    ubyte  *dptr;
  508. X    short expect;
  509. X
  510. X    if (ptr == NULL) {
  511. X    RState = 0;
  512. X    return(3);
  513. X    }
  514. X
  515. X    while (len) {
  516. X    switch(RState) {
  517. X    case 0:
  518. X        --len;
  519. X        Pkt.sync = *ptr++;
  520. X
  521. X        if (Pkt.sync == SYNC)
  522. X        ++RState;
  523. X        break;
  524. X    case 1:     /*  CTL */
  525. X        --len;
  526. X        Pkt.ctl = *ptr++;
  527. X
  528. X        if (Pkt.ctl < 0x20 || Pkt.ctl > 0x7F) {
  529. X        RState = 0;
  530. X        break;
  531. X        }
  532. X        ++RState;
  533. X        break;
  534. X    case 2:     /*  CCHK    */
  535. X        --len;
  536. X        Pkt.cchk = *ptr++;
  537. X
  538. X        if (Ascize((SYNC<<1) ^ Pkt.ctl) != Pkt.cchk) {
  539. X        RState = 0;
  540. X        break;
  541. X        }
  542. X        switch(Pkt.ctl & PKF_MASK) {
  543. X        case PKCMD_ACKRSTART:
  544. X        case PKCMD_WRITE:
  545. X        case PKCMD_WRITE6:
  546. X        case PKCMD_WRITE7:
  547. X        ++RState;
  548. X        break;
  549. X        default:
  550. X        do_cmd(Pkt.ctl, NULL, 0);
  551. X        RState = 0;
  552. X        break;
  553. X        }
  554. X        break;
  555. X    case 3:     /*  LENH    */
  556. X        --len;
  557. X        Pkt.lenh = *ptr++;
  558. X
  559. X        ++RState;
  560. X        if (Pkt.lenh < 0x20 || Pkt.lenh > 0x7F)
  561. X        RState = 0;
  562. X        break;
  563. X    case 4:     /*  LENL    */
  564. X        --len;
  565. X        Pkt.lenl = *ptr++;
  566. X
  567. X        if (Pkt.lenl < 0x20 || Pkt.lenl > 0x7F) {
  568. X        RState = 0;
  569. X        break;
  570. X        }
  571. X
  572. X        ++RState;
  573. X
  574. X        ActLen = ((Pkt.lenh & 0x3F) << 6) | (Pkt.lenl & 0x3F);
  575. X        DBLen = 0;
  576. X
  577. X        switch(Pkt.ctl & PKF_MASK) {
  578. X        case PKCMD_ACKRSTART:
  579. X        case PKCMD_WRITE:
  580. X        BufLen = ActLen;
  581. X        break;
  582. X        case PKCMD_WRITE6:
  583. X        BufLen = (ActLen * 8 + 5) / 6;
  584. X        break;
  585. X        case PKCMD_WRITE7:
  586. X        BufLen = (ActLen * 7 + 7) / 8;
  587. X        break;
  588. X        default:
  589. X        puts("BaD");
  590. X        break;
  591. X        }
  592. X
  593. X        if (ActLen > MAXPKT || BufLen > MAXPACKET) {
  594. X        if (PDebug || DDebug)
  595. X            printf("Packet Length Error %d %d\n", ActLen, BufLen);
  596. X        RState = 0;
  597. X        }
  598. X        break;
  599. X    case 5:     /*  DChkH   */
  600. X        --len;
  601. X        Pkt.dchkh = *ptr++;
  602. X
  603. X        ++RState;
  604. X        if (Pkt.dchkh < 0x20 || Pkt.dchkh > 0x7F)
  605. X        RState = 0;
  606. X        break;
  607. X    case 6:     /*  DCHKL   */
  608. X        --len;
  609. X        Pkt.dchkl = *ptr++;
  610. X
  611. X        ++RState;
  612. X        if (Pkt.dchkl < 0x20 || Pkt.dchkl > 0x7F)
  613. X        RState = 0;
  614. X        break;
  615. X    case 7:     /*  -DATA-  */
  616. X        if (DBLen + len < BufLen) {     /*  not enough  */
  617. X        BMov(ptr, Pkt.data + DBLen, len);
  618. X        DBLen += len;
  619. X        len = 0;
  620. X        break;
  621. X        }
  622. X
  623. X        /*
  624. X         *    Enough data, check chk
  625. X         */
  626. X
  627. X        BMov(ptr, Pkt.data + DBLen, BufLen - DBLen);
  628. X        len -= BufLen - DBLen;
  629. X        ptr += BufLen - DBLen;
  630. X
  631. X        {
  632. X        uword chk;
  633. X        ubyte chkh;
  634. X        ubyte chkl;
  635. X
  636. X        chk = chkbuf(Pkt.data, BufLen);
  637. X        chkh = Ascize(chk >> 8);
  638. X        chkl = Ascize(chk);
  639. X
  640. X        if (Pkt.dchkh != chkh || Pkt.dchkl != chkl) {
  641. X            printf("Chksum failure %02x %02x %02x %02x\n",
  642. X            Pkt.dchkh, chkh, Pkt.dchkl, chkl
  643. X            );
  644. X            RState = 0;
  645. X            break;
  646. X        }
  647. X        }
  648. X
  649. X        switch(Pkt.ctl & PKF_MASK) {
  650. X        case PKCMD_ACKRSTART:
  651. X        dptr = Pkt.data;
  652. X        break;
  653. X        case PKCMD_WRITE:
  654. X        dptr = Pkt.data;
  655. X        ++Packets8In;
  656. X        break;
  657. X        case PKCMD_WRITE6:
  658. X        UnExpand6(Pkt.data, RxTmp, ActLen);
  659. X        dptr = RxTmp;
  660. X        ++Packets6In;
  661. X        break;
  662. X        case PKCMD_WRITE7:
  663. X        UnCompress7(Pkt.data, RxTmp, ActLen);
  664. X        dptr = RxTmp;
  665. X        ++Packets7In;
  666. X        break;
  667. X        default:
  668. X        puts("BaD2");
  669. X        dptr = Pkt.data;
  670. X        break;
  671. X        }
  672. X
  673. X        do_cmd(Pkt.ctl, dptr, ActLen);
  674. X
  675. X        RState = 0;
  676. X        break;
  677. X    }
  678. X    }
  679. X
  680. X    {
  681. X    static short ExpAry[] = { 3, 2, 1, 4, 3, 2, 1, 0 };
  682. X
  683. X    expect = ExpAry[RState];
  684. X
  685. X    if (RState == 7)
  686. X        expect = BufLen - DBLen;
  687. X    }
  688. X    if (Rto_act) {
  689. X    AbortIO((IOR *)&Rto);
  690. X    WaitIO((IOR *)&Rto);
  691. X    Rto_act = 0;
  692. X    }
  693. X    if (RState == 7) {
  694. X    Rto.tr_time.tv_secs = 8;
  695. X    Rto.tr_time.tv_micro= 0;
  696. X    SendIO((IOR *)&Rto);
  697. X    Rto_act = 1;
  698. X    }
  699. X    do_cmd((uword)-1, NULL, 0);
  700. X    return((int)expect);
  701. X}
  702. X
  703. END_OF_FILE
  704. if test 6237 -ne `wc -c <'amiga/dnet/packet.c'`; then
  705.     echo shar: \"'amiga/dnet/packet.c'\" unpacked with wrong size!
  706. fi
  707. # end of 'amiga/dnet/packet.c'
  708. fi
  709. if test -f 'amiga/server/sterm.c' -a "${1}" != "-c" ; then 
  710.   echo shar: Will not clobber existing file \"'amiga/server/sterm.c'\"
  711. else
  712. echo shar: Extracting \"'amiga/server/sterm.c'\" \(6678 characters\)
  713. sed "s/^X//" >'amiga/server/sterm.c' <<'END_OF_FILE'
  714. X
  715. X/*
  716. X *  S_TERM.C
  717. X *
  718. X *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  719. X *
  720. X *  Terminal window server.
  721. X *    -Echo what is received in the window.
  722. X *    -Transmit stuff typed on keyboard, echoing locally.
  723. X *
  724. X *  Use FTERM on the other Amiga to connect.
  725. X *
  726. X *  NOTE!!!!  Spawned tasks are ... TASKS, not processes.  No DOS calls
  727. X *  allowed.
  728. X */
  729. X
  730. X#include "defs.h"
  731. X
  732. Xint NHandlers;
  733. X
  734. Xstruct IntuitionBase *IntuitionBase;
  735. Xstruct GfxBase *GfxBase;
  736. X
  737. XPORT *HdPort;
  738. XPORT *LisPort;
  739. Xshort HandShakeSig;
  740. X
  741. Xint spawn_handler ARGS((void));
  742. Xvoid __saveds term_task ARGS((void));
  743. Xvoid HandleIoctl ARGS((short, short, char, WIN *, IOCON *, short*));
  744. Xvoid setsize ARGS((IOCON *, void *, WIN *));
  745. X
  746. Xint
  747. Xbrk()
  748. X{
  749. X    return(0);
  750. X}
  751. X
  752. Xvoid
  753. X#ifdef LATTICE
  754. X_main(str)
  755. X#else
  756. X_main(len,str)
  757. X#endif
  758. Xchar *str;
  759. X{
  760. X    MSG *msg;
  761. X    long mask, pmask, hdmask;
  762. X    PROC *proc = (PROC *)FindTask(NULL);
  763. X
  764. X    onbreak(brk);
  765. X
  766. X    if (strncmp(str, "__dnet", 6) != 0) {
  767. X    Version("STerm", VERSION, STERM_VERSION);
  768. X    _exit(0);
  769. X    }
  770. X
  771. X    LisPort= DListen(PORT_IALPHATERM);
  772. X    WaitPort(&proc->pr_MsgPort);
  773. X    ReplyMsg(GetMsg(&proc->pr_MsgPort));
  774. X    if (!LisPort)
  775. X    exit(1);
  776. X    HdPort = CreatePort(NULL, 0);
  777. X    HandShakeSig = AllocSignal(-1);
  778. X    pmask = 1 << LisPort->mp_SigBit;
  779. X    hdmask= 1 << HdPort->mp_SigBit;
  780. X
  781. X    IntuitionBase   = (struct IntuitionBase *)OpenLibrary("intuition.library", 0);
  782. X    GfxBase        = (struct GfxBase *)OpenLibrary("graphics.library", 0);
  783. X    while (mask = Wait(SIGBREAKF_CTRL_C|pmask|hdmask)) {
  784. X    if (mask & SIGBREAKF_CTRL_C)
  785. X        break;
  786. X    if (mask & hdmask) {
  787. X        while (msg = GetMsg(HdPort)) {
  788. X        --NHandlers;
  789. X        FreeMem(msg, sizeof(*msg));
  790. X        }
  791. X    }
  792. X    if (mask & pmask) {
  793. X        while (spawn_handler())
  794. X        ;
  795. X    }
  796. X    }
  797. X    DUnListen(LisPort);
  798. X    while (NHandlers) {
  799. X    WaitPort(HdPort);
  800. X    msg = GetMsg(HdPort);
  801. X    FreeMem(msg, sizeof(*msg));
  802. X    --NHandlers;
  803. X    }
  804. X    DeletePort(HdPort);
  805. X    CloseLibrary((LIB *)IntuitionBase);
  806. X    CloseLibrary((LIB *)GfxBase);
  807. X}
  808. X
  809. X/*
  810. X *  Spawn a handler to accept the new connection, if any.  Task sends
  811. X *  a message to HdPort when through.
  812. X */
  813. X
  814. Xint
  815. Xspawn_handler()
  816. X{
  817. X    long oldhan = NHandlers;
  818. X
  819. X    CreateTask("Term.channel", 0, (APTR)term_task, 2048);
  820. X    Wait(1 << HandShakeSig);
  821. X    return (oldhan != NHandlers);
  822. X}
  823. X
  824. Xstatic NW Nw = {
  825. X    64, 64, 400, 100, -1, -1,
  826. X    CLOSEWINDOW|NEWSIZE,
  827. X    WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|ACTIVATE|NOCAREREFRESH,
  828. X    NULL, NULL, (unsigned char *)"DNET-Term", NULL, NULL, 32, 32, -1, -1,
  829. X    WBENCHSCREEN
  830. X};
  831. X
  832. Xvoid __saveds
  833. Xterm_task()
  834. X{
  835. X    void *chan;
  836. X    long imask, cmask, conmask;
  837. X    WIN *win;
  838. X    char notdone = 1;
  839. X    short ignorens = 0;
  840. X    char conc[4];
  841. X    IOCON iocw;
  842. X    IOCON iocr;
  843. X
  844. X#ifndef LATTICE
  845. X    geta4();
  846. X#endif
  847. X    chan = DAccept(LisPort);
  848. X    if (chan) {
  849. X    DQueue(chan, 32);
  850. X    DIoctl(chan, CIO_MODE, 7, 0);
  851. X    ++NHandlers;
  852. X    Signal(HdPort->mp_SigTask, 1 << HandShakeSig);
  853. X    if (win = OpenWindow(&Nw)) {
  854. X        iocw.io_Command = CMD_WRITE;
  855. X        iocw.io_Data = (APTR)win;
  856. X        iocw.io_Message.mn_Node.ln_Type = NT_MESSAGE;
  857. X        iocw.io_Message.mn_ReplyPort = CreatePort(NULL,0);
  858. X        conmask = 1 << iocw.io_Message.mn_ReplyPort->mp_SigBit;
  859. X        OpenDevice("console.device", 0, &iocw, 0);
  860. X        iocr = iocw;
  861. X        iocr.io_Command = CMD_READ;
  862. X        imask = 1 << win->UserPort->mp_SigBit;
  863. X        cmask = 1 << ((PORT *)chan)->mp_SigBit;
  864. X
  865. X        iocr.io_Data = (APTR)conc;
  866. X        iocr.io_Length = sizeof(conc);
  867. X        SendIO(&iocr);
  868. X
  869. X        setsize(&iocw, NULL, win);
  870. X        while (notdone) {
  871. X        long mask;
  872. X        mask = Wait(imask|cmask|conmask);
  873. X
  874. X        if (mask & imask) {
  875. X            IMESS *im;
  876. X            while (im = (IMESS *)GetMsg(win->UserPort)) {
  877. X            switch(im->Class) {
  878. X            case CLOSEWINDOW:
  879. X                notdone = 0;
  880. X                break;
  881. X            case NEWSIZE:
  882. X                if (ignorens) {
  883. X                --ignorens;
  884. X                setsize(&iocw, NULL, win);
  885. X                } else {
  886. X                setsize(&iocw, chan, win);
  887. X                }
  888. X                break;
  889. X            }
  890. X            ReplyMsg((MSG *)im);
  891. X            }
  892. X        }
  893. X        if ((mask & conmask) && CheckIO(&iocr)) {
  894. X            short i;
  895. X            char *ptr;
  896. X            WaitIO(&iocr);
  897. X            ptr = (char *)iocr.io_Data;
  898. X
  899. X            if (iocr.io_Actual > 0) {
  900. X            for (i = 0; i < iocr.io_Actual; ++i) {
  901. X                if (ptr[i] == 13)
  902. X                ptr[i] = 10;
  903. X            }
  904. X            DWrite(chan, ptr, i);
  905. X            iocw.io_Data = (APTR)ptr;
  906. X            iocw.io_Length = i;
  907. X            DoIO(&iocw);
  908. X            }
  909. X            iocr.io_Data = (APTR)conc;
  910. X            iocr.io_Length = sizeof(conc);
  911. X            SendIO(&iocr);
  912. X        }
  913. X        if (mask & cmask) {
  914. X            long n;
  915. X            char buf[32];
  916. X            while (n = DNRead(chan, buf, sizeof(buf))) {
  917. X            if (n == -2) {
  918. X                short cmd, val;
  919. X                char aux;
  920. X                cmd = DGetIoctl(chan, &val, &aux);
  921. X                if (cmd >= 0)
  922. X                HandleIoctl(cmd, val, aux, win, &iocw, &ignorens);
  923. X                continue;
  924. X            }
  925. X            if (n < 0) {
  926. X                notdone = 0;
  927. X                break;
  928. X            }
  929. X            if (buf[0] == 3)        /*  remote ^C -- done   */
  930. X                notdone = 0;
  931. X            iocw.io_Data = (APTR)buf;
  932. X            iocw.io_Length = n;
  933. X            DoIO(&iocw);
  934. X            }
  935. X        }
  936. X        }
  937. X        AbortIO(&iocr);
  938. X        WaitIO(&iocr);
  939. X        CloseDevice(&iocw);
  940. X        DeletePort(iocw.io_Message.mn_ReplyPort);
  941. X        CloseWindow(win);
  942. X    }
  943. X    DClose(chan);
  944. X    {
  945. X        MSG *msg;
  946. X        msg = AllocMem(sizeof(MSG), MEMF_PUBLIC);
  947. X        Forbid();
  948. X        PutMsg(HdPort, msg);
  949. X    }
  950. X    } else {
  951. X    Forbid();
  952. X    Signal(HdPort->mp_SigTask, 1 << HandShakeSig);
  953. X    }
  954. X    RemTask(NULL);
  955. X}
  956. X
  957. Xvoid
  958. XHandleIoctl(cmd, val, aux, win, iocw, igns)
  959. Xshort cmd, val;
  960. Xchar aux;
  961. XWIN *win;
  962. XIOCON *iocw;
  963. Xshort *igns;
  964. X{
  965. X    static short saverows;
  966. X    short height, width;
  967. X    short dx, dy;
  968. X
  969. X    switch(cmd) {
  970. X    case CIO_SETROWS:
  971. X    saverows = val;
  972. X    break;
  973. X    case CIO_SETCOLS:
  974. X    width = val * win->RPort->TxWidth + win->BorderLeft + win->BorderRight;
  975. X    height= saverows * win->RPort->TxHeight + win->BorderTop + win->BorderBottom;
  976. X
  977. X    dx = win->WScreen->Width - (win->LeftEdge + width);
  978. X    if (dx > 0)
  979. X        dx = 0;
  980. X    if (-dx > win->LeftEdge) {
  981. X        dx = -win->LeftEdge;
  982. X        width = win->WScreen->Width;
  983. X    }
  984. X
  985. X    dy = win->WScreen->Height - (win->TopEdge + height);
  986. X    if (dy > 0)
  987. X        dy = 0;
  988. X    if (-dy > win->TopEdge) {
  989. X        dy = -win->TopEdge;
  990. X        height = win->WScreen->Height;
  991. X    }
  992. X
  993. X    if (dx || dy) {
  994. X        MoveWindow(win, dx, dy);
  995. X    }
  996. X    if (win->Width != width || win->Height != height) {
  997. X        SizeWindow(win, width - win->Width, height - win->Height);
  998. X        ++*igns;
  999. X    }
  1000. X    break;
  1001. X    }
  1002. X}
  1003. X
  1004. Xvoid
  1005. Xsetsize(iocw, chan, win)
  1006. XIOCON *iocw;
  1007. Xvoid *chan;
  1008. XWIN *win;
  1009. X{
  1010. X    struct ConUnit *cu = (struct ConUnit *)iocw->io_Unit;
  1011. X    static char Term[64];
  1012. X
  1013. X    iocw->io_Data = (APTR)"\033c\033[20h\033[t\033[u";
  1014. X    iocw->io_Length = 13;
  1015. X    DoIO(iocw);
  1016. X    if (chan) {
  1017. X    DIoctl(chan, CIO_SETROWS, (uword)(cu->cu_YMax+1), 0);
  1018. X    DIoctl(chan, CIO_SETCOLS, (uword)(cu->cu_XMax+1), 0);
  1019. X    }
  1020. X    sprintf(Term, "STERM   %ld x %ld", cu->cu_YMax+1, cu->cu_XMax+1);
  1021. X    SetWindowTitles(win, Term, (char *)-1);
  1022. X}
  1023. X
  1024. END_OF_FILE
  1025. if test 6678 -ne `wc -c <'amiga/server/sterm.c'`; then
  1026.     echo shar: \"'amiga/server/sterm.c'\" unpacked with wrong size!
  1027. fi
  1028. # end of 'amiga/server/sterm.c'
  1029. fi
  1030. if test -f 'unix/client/getfiles.c' -a "${1}" != "-c" ; then 
  1031.   echo shar: Will not clobber existing file \"'unix/client/getfiles.c'\"
  1032. else
  1033. echo shar: Extracting \"'unix/client/getfiles.c'\" \(7606 characters\)
  1034. sed "s/^X//" >'unix/client/getfiles.c' <<'END_OF_FILE'
  1035. X
  1036. X/*
  1037. X *  GETFILES.C        V1.30
  1038. X *
  1039. X *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  1040. X *
  1041. X *  GETFILES [-dlocaldir] [-c] file/dir file/dir file/dir
  1042. X *
  1043. X *  -dlocaldir    local directory to place files
  1044. X *
  1045. X *  -c        Continue from where you left off before.  Files that already
  1046. X *        exist on the local machine will not be re-transfered.  This
  1047. X *        will also re-start in the middle of a file that was
  1048. X *        partially transfered previously.
  1049. X *
  1050. X *        This command assumes the file(s) on both machines have not
  1051. X *        been modified since the first attempt.    No other checking
  1052. X *        is done at the moment.
  1053. X */
  1054. X
  1055. X#include <stdio.h>
  1056. X#include <sys/types.h>
  1057. X#include <sys/file.h>
  1058. X#include <sys/stat.h>
  1059. X#include "../server/servers.h"
  1060. X
  1061. Xtypedef unsigned char ubyte;
  1062. X
  1063. Xtypedef struct {
  1064. X    char    Cmd;
  1065. X    char    Str[64];
  1066. X    long    Val;
  1067. X} HDR;
  1068. X
  1069. Xchar *NSpaces();
  1070. X
  1071. Xchar Buf[1024];
  1072. X
  1073. Xshort ContMode;
  1074. Xchar  *NetId;
  1075. Xlong  Chan = -1;
  1076. X
  1077. Xmain(ac,av)
  1078. Xchar *av[];
  1079. X{
  1080. X    HDR Hdr;
  1081. X    short error;
  1082. X
  1083. X    {
  1084. X    char *ldir = ".";
  1085. X    struct stat stat;
  1086. X    ac = DoOption(ac, av, "N%sd%sc", &NetId, &ldir, &ContMode);
  1087. X    if (ac <= 1) {
  1088. X        puts("GETFILES [-Nnetid -dlocaldir -c] remotefile/dir ...");
  1089. X        fail(22);
  1090. X    }
  1091. X    if (chdir(ldir) < 0) {
  1092. X        mkdir(ldir, 0777);
  1093. X        if (chdir(ldir) < 0) {
  1094. X        printf("Unable to CD or make local directory: \"%s\"\n",ldir);
  1095. X        fail(21);
  1096. X        }
  1097. X    }
  1098. X    }
  1099. X    Chan = DOpen(NetId, PORT_GFILECOPY, 126, -80);
  1100. X    if (Chan < 0) {
  1101. X    puts("Unable to connect");
  1102. X    fail(20);
  1103. X    }
  1104. X    error = WriteHeader('H', "Hello, getfiles client V1.30", 0);
  1105. X    if (error)
  1106. X    fail(LostChannel());
  1107. X    switch(ReadHeader(&Hdr)) {
  1108. X    case -1:
  1109. X    fail(LostChannel());
  1110. X    case 'H':
  1111. X    printf("%s\n", Hdr.Str);
  1112. X    break;
  1113. X    }
  1114. X    {
  1115. X    register short i;
  1116. X    long val;
  1117. X
  1118. X    for (i = 1; i < ac; ++i) {
  1119. X        short error;
  1120. X
  1121. X        error = WriteHeader('G', av[i], 0);
  1122. X        if (error)
  1123. X        fail(LostChannel());
  1124. X        switch(ReadHeader(&Hdr)) {
  1125. X        case -1:
  1126. X        fail(LostChannel());
  1127. X        case 'N':
  1128. X        printf("Remote error on %s: %s\n", av[i], Hdr.Str);
  1129. X        break;
  1130. X        case 'F':
  1131. X        error = CheckNoPath(Hdr.Str);
  1132. X        if (!error) {
  1133. X            char svpath[1024];
  1134. X            getwd(svpath);
  1135. X            error = GetFile(&Hdr, 0);
  1136. X            chdir(svpath);
  1137. X        }
  1138. X        break;
  1139. X        case 'D':
  1140. X        error = CheckNoPath(Hdr.Str);
  1141. X        if (!error) {
  1142. X            char svpath[1024];
  1143. X            getwd(svpath);
  1144. X            error = GetDir(&Hdr, 0);
  1145. X            chdir(svpath);
  1146. X        }
  1147. X        break;
  1148. X        case 'S':
  1149. X        printf("Access Violation: %s\n", Hdr.Str);
  1150. X        break;
  1151. X        default:
  1152. X        error = UnknownCmd(&Hdr);
  1153. X        break;
  1154. X        }
  1155. X        if (error)
  1156. X        fail(error);
  1157. X    }
  1158. X    if (!error) {
  1159. X        error = WriteHeader('E', "bye", 0);
  1160. X        if (error)
  1161. X        fail(LostChannel());
  1162. X    }
  1163. X    }
  1164. X    fail(0);
  1165. X}
  1166. X
  1167. Xfail(code)
  1168. X{
  1169. X    if (Chan >= 0)
  1170. X    close(Chan);
  1171. X    exit(code);
  1172. X}
  1173. X
  1174. XCheckNoPath(str)
  1175. Xregister char *str;
  1176. X{
  1177. X    while (*str) {
  1178. X    if (*str == '/' || *str == ':') {
  1179. X        puts("SECURITY ALERT: Illegal path spec received");
  1180. X        return(40);
  1181. X    }
  1182. X    ++str;
  1183. X    }
  1184. X    return(0);
  1185. X}
  1186. X
  1187. XLostChannel()
  1188. X{
  1189. X    puts("DATA CHANNEL LOST");
  1190. X    return(10);
  1191. X}
  1192. X
  1193. XUnknownCmd(hdr)
  1194. XHDR *hdr;
  1195. X{
  1196. X    printf("Unrecognized command code: %02x\n", hdr->Cmd);
  1197. X}
  1198. X
  1199. X/*
  1200. X *  retrieve a file.  If ContMode set and file exists, try to append to
  1201. X *  it.
  1202. X */
  1203. X
  1204. X
  1205. X#define BSSTR "\010\010\010\010\010\010\010\010\010\010\010\010\010"
  1206. X
  1207. XGetFile(hdr, stab)
  1208. XHDR *hdr;
  1209. X{
  1210. X    int fd = -1;
  1211. X    long pos = 0;
  1212. X    short error = 0;
  1213. X
  1214. X    printf("%s%-20s ", NSpaces(stab), hdr->Str);
  1215. X    fflush(stdout);
  1216. X    if (ContMode) {
  1217. X    if ((fd = open(hdr->Str, O_WRONLY)) >= 0) {    /*  already exists  */
  1218. X        long len;
  1219. X
  1220. X        len = lseek(fd, 0L, 2);
  1221. X        if (len > hdr->Val) {
  1222. X        close(fd);
  1223. X        printf("Cont Error, local file is larger than remote!: %s\n",
  1224. X           hdr->Str
  1225. X        );
  1226. X        puts("(not downloaded)");
  1227. X        return(0);
  1228. X        }
  1229. X        if (len == hdr->Val) {
  1230. X        close(fd);
  1231. X        if (error = WriteHeader('S', NULL, 0))
  1232. X            return(LostChannel());
  1233. X        puts("HAVE IT, SKIP");
  1234. X        return(0);
  1235. X        }
  1236. X        printf("(HAVE %ld/%ld) ", len, hdr->Val);
  1237. X        hdr->Val -= len;        /*  that much less  */
  1238. X        pos = len;            /*  start at offset */
  1239. X    }
  1240. X    }
  1241. X    if (fd < 0) {
  1242. X    fd = open(hdr->Str, O_WRONLY|O_CREAT|O_TRUNC, 0666);
  1243. X    if (fd < 0) {
  1244. X        error = WriteHeader('N', "open error", 0);
  1245. X        printf("Unable to open %s for output\n", hdr->Str);
  1246. X        if (error)
  1247. X        return(LostChannel());
  1248. X        return(1);
  1249. X    }
  1250. X    }
  1251. X    error = WriteHeader('Y', NULL, pos);    /*  yes, gimme gimme    */
  1252. X
  1253. X    /*
  1254. X     *    Retrieve the data
  1255. X     */
  1256. X
  1257. X    if (!error) {
  1258. X    register long left = hdr->Val;
  1259. X    register long cnt = pos;
  1260. X    long total = pos + left;
  1261. X
  1262. X    printf("             ");
  1263. X    while (left) {
  1264. X        register long n = (left > sizeof(Buf)) ? sizeof(Buf) : left;
  1265. X        printf("%s%6ld/%6ld", BSSTR, cnt, total);
  1266. X        fflush(stdout);
  1267. X        if (ggread(Chan, Buf, n) != n) {
  1268. X        error = 5;
  1269. X        break;
  1270. X        }
  1271. X        if (write(fd, Buf, n) != n) {
  1272. X        puts("Local Write failed!");
  1273. X        error = 6;
  1274. X        break;
  1275. X        }
  1276. X        left -= n;
  1277. X        cnt += n;
  1278. X    }
  1279. X    printf("%s%6ld/%6ld  %s", BSSTR, cnt, total, 
  1280. X        ((cnt == total) ? "OK" : "INCOMPLETE")
  1281. X    );
  1282. X    }
  1283. X    puts("");
  1284. X    if (error) {
  1285. X    fchmod(fd, 0222);
  1286. X    close(fd);
  1287. X    return(LostChannel());
  1288. X    }
  1289. X    close(fd);
  1290. X    return(error);
  1291. X}
  1292. X
  1293. X/*
  1294. X *  Retrieve a directory.  Create it if necessary.
  1295. X */
  1296. X
  1297. XGetDir(hdr, stab)
  1298. XHDR *hdr;
  1299. X{
  1300. X    short error = 0;
  1301. X    long dirlock;
  1302. X    static HDR Hdr;        /*    note: static */
  1303. X    char svpath[1024];
  1304. X
  1305. X    printf("%s%-20s(DIR)\n", NSpaces(stab), hdr->Str);
  1306. X    getwd(svpath);
  1307. X    if (chdir(hdr->Str) < 0) {
  1308. X    mkdir(hdr->Str, 0777);
  1309. X    if (chdir(hdr->Str) < 0) {
  1310. X        error = WriteHeader('N', "couldn't create", 0);
  1311. X        printf("Unable to create local directory: %s\n", hdr->Str);
  1312. X        if (error)
  1313. X            return(LostChannel());
  1314. X        return(1);
  1315. X    }
  1316. X    }
  1317. X    error = WriteHeader('Y', NULL, 0);  /*  yes, gimme gimme    */
  1318. X    while (!error) {
  1319. X    switch(ReadHeader(&Hdr)) {
  1320. X    case -1:
  1321. X        error = 1;
  1322. X        break;
  1323. X    case 'E':                   /*  end of directory    */
  1324. X        chdir(svpath);
  1325. X        return(0);
  1326. X        break;
  1327. X    case 'F':
  1328. X        error = CheckNoPath(Hdr.Str);
  1329. X        if (!error) {
  1330. X        char svpath2[1024];
  1331. X        getwd(svpath2);
  1332. X        error = GetFile(&Hdr, stab + 4);
  1333. X        chdir(svpath2);
  1334. X        }
  1335. X        break;
  1336. X    case 'D':
  1337. X        error = CheckNoPath(Hdr.Str);
  1338. X        if (!error) {
  1339. X        char svpath2[1024];
  1340. X        getwd(svpath2);
  1341. X        error = GetDir(&Hdr, stab + 4);
  1342. X        chdir(svpath2);
  1343. X        }
  1344. X        break;
  1345. X    case 'S':
  1346. X        printf("Access Violation: %s\n", Hdr.Str);
  1347. X        break;
  1348. X    case 'N':
  1349. X        printf("REMOTE ERROR: %s\n", Hdr.Str);
  1350. X        error = 10;
  1351. X        break;
  1352. X    default:
  1353. X        error = UnknownCmd(&Hdr);
  1354. X        break;
  1355. X    }
  1356. X    }
  1357. X    chdir(svpath);
  1358. X    return(LostChannel());
  1359. X}
  1360. X
  1361. XWriteHeader(c, str, len)
  1362. Xchar c;
  1363. Xchar *str;
  1364. Xlong len;
  1365. X{
  1366. X    ubyte sl;
  1367. X
  1368. X    if (str == NULL)
  1369. X    str = "";
  1370. X    sl = strlen(str);
  1371. X
  1372. X    if (gwrite(Chan, &c, 1) < 0)
  1373. X    return(1);
  1374. X    if (gwrite(Chan, &sl,1) < 0)
  1375. X    return(1);
  1376. X    if (gwrite(Chan, str, sl) != sl)
  1377. X    return(1);
  1378. X    len = htonl68(len);
  1379. X    if (gwrite(Chan, &len, 4) != 4)
  1380. X    return(1);
  1381. X    return(0);
  1382. X}
  1383. X
  1384. XReadHeader(hdr)
  1385. XHDR *hdr;
  1386. X{
  1387. X    ubyte sl;
  1388. X    ubyte cmd;
  1389. X
  1390. X    hdr->Cmd = -1;
  1391. X    if (ggread(Chan, &cmd, 1) != 1)
  1392. X    return(-1);
  1393. X    if (ggread(Chan, &sl, 1) != 1)
  1394. X    return(-1);
  1395. X    if (sl >= sizeof(hdr->Str)) {
  1396. X    puts("Software error: received file name length too long");
  1397. X    return(-1);
  1398. X    }
  1399. X    if (ggread(Chan, hdr->Str, sl) != sl)
  1400. X    return(-1);
  1401. X    hdr->Str[sl] = 0;
  1402. X    if (ggread(Chan, &hdr->Val, 4) != 4)
  1403. X    return(-1);
  1404. X    hdr->Val = ntohl68(hdr->Val);
  1405. X    hdr->Cmd = cmd;
  1406. X    return(hdr->Cmd);
  1407. X}
  1408. X
  1409. Xchar *
  1410. XNSpaces(n)
  1411. Xshort n;
  1412. X{
  1413. X    static char Buf[128];
  1414. X    static short in = 0;
  1415. X    static short last;
  1416. X
  1417. X    if (in == 0) {
  1418. X    register short i;
  1419. X    in = 1;
  1420. X    for (i = 0; i < sizeof(Buf); ++i)
  1421. X        Buf[i] = ' ';
  1422. X    }
  1423. X    Buf[last] = ' ';
  1424. X    if (n < 127)
  1425. X    Buf[n] = 0;
  1426. X    last = n;
  1427. X    return(Buf);
  1428. X}
  1429. X
  1430. END_OF_FILE
  1431. if test 7606 -ne `wc -c <'unix/client/getfiles.c'`; then
  1432.     echo shar: \"'unix/client/getfiles.c'\" unpacked with wrong size!
  1433. fi
  1434. # end of 'unix/client/getfiles.c'
  1435. fi
  1436. if test -f 'unix/dnet/dnet.c' -a "${1}" != "-c" ; then 
  1437.   echo shar: Will not clobber existing file \"'unix/dnet/dnet.c'\"
  1438. else
  1439. echo shar: Extracting \"'unix/dnet/dnet.c'\" \(7795 characters\)
  1440. sed "s/^X//" >'unix/dnet/dnet.c' <<'END_OF_FILE'
  1441. X
  1442. X/*
  1443. X *  DNET.C
  1444. X *
  1445. X *    DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved
  1446. X *
  1447. X *    Handles action on all active file descriptors and dispatches
  1448. X *    to the proper function in FILES.C
  1449. X *
  1450. X */
  1451. X
  1452. X#include "dnet.h"
  1453. X#include <sys/wait.h>
  1454. X#include <sys/resource.h>
  1455. X#include <sys/un.h>
  1456. X
  1457. Xhandle_child()
  1458. X{
  1459. X    union wait stat;
  1460. X    struct rusage rus;
  1461. X    while (wait3(&stat, WNOHANG, &rus) > 0);
  1462. X}
  1463. X
  1464. Xchar *
  1465. Xshowselect(ptr)
  1466. Xfd_set *ptr;
  1467. X{
  1468. X    static char buf[FD_SETSIZE+32];
  1469. X    short i;
  1470. X
  1471. X    for (i = 0; i < FD_SETSIZE; ++i) {
  1472. X    buf[i] = (FD_ISSET(i, ptr)) ? '1' : '0';
  1473. X    }
  1474. X    buf[i] = 0;
  1475. X    return(buf);
  1476. X}
  1477. X
  1478. X
  1479. Xloganddie()
  1480. X{
  1481. X    fflush(stderr);
  1482. X    fprintf(stderr, "\nHUPSIGNAL\n");
  1483. X    perror("HUP, last error:");
  1484. X    fprintf(stderr, "Last select return:\n");
  1485. X    fprintf(stderr, "  %s\n", showselect(&Fdread));
  1486. X    fprintf(stderr, "  %s\n", showselect(&Fdwrite));
  1487. X    fprintf(stderr, "  %s\n", showselect(&Fdexcept));
  1488. X    fprintf(stderr, "RcvData = %ld\n", RcvData);
  1489. X    fprintf(stderr, "RChan/WChan = %ld/%ld\n", RChan, WChan);
  1490. X    fprintf(stderr, "RPStart = %ld\n", RPStart);
  1491. X    fprintf(stderr, "WPStart = %ld\n", WPStart);
  1492. X    fprintf(stderr, "WPUsed = %ld\n", WPUsed);
  1493. X    fprintf(stderr, "RState = %ld\n", RState);
  1494. X    fflush(stderr);
  1495. X    kill(0, SIGILL);
  1496. X    exit(1);
  1497. X}
  1498. X
  1499. X#define SASIZE(sa)      (sizeof(sa)-sizeof((sa).sa_data)+strlen((sa).sa_data))
  1500. X
  1501. Xmain(ac,av)
  1502. Xchar *av[];
  1503. X{
  1504. X    long sink_mask, dnet_mask;
  1505. X    ubyte notdone;
  1506. X    char local_dir[MAXPATHLEN];
  1507. X    struct passwd pw_info;
  1508. X    extern void RcvInt();
  1509. X
  1510. X    if (write(0, "", 0) < 0) {
  1511. X    perror("write");
  1512. X    exit(1);
  1513. X    }
  1514. X
  1515. X    if (getenv("DNETDIR")) {
  1516. X    strcpy(local_dir, getenv("DNETDIR"));
  1517. X    if (chdir(local_dir)) {
  1518. X        fprintf(stderr, "Unable to chdir to DNETDIR: %s\n", local_dir);
  1519. X        exit(1);
  1520. X    }
  1521. X    freopen("DNET.LOG", "w", stderr);
  1522. X    setlinebuf(stderr);
  1523. X    } else {
  1524. X    pw_info = *getpwuid(getuid());
  1525. X    strcpy(local_dir, pw_info.pw_dir);
  1526. X    strcat(local_dir, "/.dnet");
  1527. X    if (chdir(local_dir)) {
  1528. X        mkdir(local_dir, 0700);
  1529. X        if (chdir(local_dir)) {
  1530. X        fprintf(stderr, "Unable to create dir %s\n", local_dir);
  1531. X        exit(1);
  1532. X        }
  1533. X    }
  1534. X    freopen("DNET.LOG", "w", stderr);
  1535. X    }
  1536. X    fprintf(stderr, "DNet startup\n");
  1537. X    fprintf(stderr, "Log file placed in %s\n", local_dir);
  1538. X
  1539. X    /*signal(SIGINT, SIG_IGN);*/
  1540. X    signal(SIGPIPE, SIG_IGN);
  1541. X    /*signal(SIGQUIT, SIG_IGN);*/
  1542. X    signal(SIGCHLD, handle_child);
  1543. X    signal(SIGHUP, loganddie);
  1544. X
  1545. X    bzero(Pkts,sizeof(Pkts));
  1546. X    setlistenport("3");
  1547. X
  1548. X    {
  1549. X    register short i;
  1550. X    for (i = 1; i < ac; ++i) {
  1551. X        register char *ptr = av[i];
  1552. X        if (*ptr != '-') {
  1553. X        DDebug = 1;
  1554. X        fprintf(stderr, "Debug mode on\n");
  1555. X        setlinebuf(stderr);
  1556. X        setlinebuf(stdout);
  1557. X        continue;
  1558. X        }
  1559. X        ++ptr;
  1560. X        switch(*ptr) {
  1561. X        case 'B':
  1562. X        break;
  1563. X        case 'm':    /* Mode7 */
  1564. X        Mode7 = atoi(ptr + 1);
  1565. X        if (Mode7 == 0)
  1566. X            fprintf(stderr, "8 bit mode selected\n");
  1567. X        else
  1568. X            fprintf(stderr, "7 bit mode selected\n");
  1569. X        break;
  1570. X        default:
  1571. X        fprintf(stderr, "Unknown option: %c\n", *ptr);
  1572. X        printf("Unknown option: %c\n", *ptr);
  1573. X        exit(1);
  1574. X        }
  1575. X    }
  1576. X    }
  1577. X
  1578. X    NewList(&TxList);
  1579. X
  1580. X    Fdperm[0] = 1;
  1581. X    Fdstate[0] = RcvInt;
  1582. X    FD_SET(0, &Fdread);
  1583. X    FD_SET(0, &Fdexcept);
  1584. X
  1585. X    fprintf(stderr, "DNET RUNNING, Listenfd=%ld\n", DNet_fd);
  1586. X    NetOpen();          /* initialize network and interrupt driven read */
  1587. X    TimerOpen();        /* initialize timers                            */
  1588. X
  1589. X    do_netreset();
  1590. X    do_restart();
  1591. X
  1592. X    notdone = 1;
  1593. X    while (notdone) {
  1594. X    /*
  1595. X     *    MAIN LOOP.  select() on all the file descriptors.  Set the
  1596. X     *    timeout to infinity (NULL) normally.  However, if there is
  1597. X     *    a pending read or write timeout, set the select timeout
  1598. X     *    to 2 seconds in case they timeout before we call select().
  1599. X     *    (i.e. a timing window).  OR, if we are in the middle of a
  1600. X     *    read, don't use descriptor 0 and timeout according to
  1601. X     *    the expected read length, then set the descriptor as ready.
  1602. X     */
  1603. X
  1604. X    fd_set fd_rd;
  1605. X    fd_set fd_wr;
  1606. X    fd_set fd_ex;
  1607. X    struct timeval tv, *ptv;
  1608. X    int err;
  1609. X
  1610. X    fd_rd = Fdread;
  1611. X    fd_wr = Fdwrite;
  1612. X    fd_ex = Fdexcept;
  1613. X
  1614. X    tv.tv_sec = 0;        /* normally wait forever for an event */
  1615. X    tv.tv_usec= 0;
  1616. X    ptv = NULL;
  1617. X    if ((Rto_act || Wto_act)) {     /* unless timeout pending */
  1618. X        ptv = &tv;
  1619. X        tv.tv_sec = 2;
  1620. X    }
  1621. X
  1622. X    /*   ... or expecting data (don't just wait for one byte).
  1623. X     *
  1624. X     *   This is an attempt to reduce the CPU usage for the process.
  1625. X     *   If we are expecting data over the serial line, then don't
  1626. X     *   return from the select() even if data is available, but
  1627. X     *   wait for the timeout period indicated before reading the
  1628. X     *   data.  Don't wait more than 64 byte times or we may loose
  1629. X     *   some data (the silo's are only so big.. like 128 bytes).
  1630. X     *
  1631. X     *   Currently we wait 1562uS/byte (1/10 second for 64 bytes)
  1632. X     *   This number is used simply so we don't hog the cpu reading
  1633. X     *   a packet.
  1634. X     */
  1635. X
  1636. X    if (RExpect) {
  1637. X        ptv = &tv;
  1638. X        tv.tv_usec= 1562L * ((RExpect < 64) ? RExpect : 64);
  1639. X        tv.tv_sec = 0;
  1640. X        FD_CLR(0, &fd_rd);
  1641. X    }
  1642. X    if (WReady) {    /* transmit stage has work to do */
  1643. X        ptv = &tv;
  1644. X        tv.tv_usec = 0;
  1645. X        tv.tv_sec = 0;
  1646. X    }
  1647. X    err = select(FD_SETSIZE, &fd_rd, &fd_wr, &fd_ex, ptv);
  1648. X    if (RExpect) {
  1649. X        FD_SET(0, &fd_rd);   /* pretend data ready */
  1650. X    }
  1651. X    if (DDebug)
  1652. X        fprintf(stderr, "SERR %ld %ld %08lx %08lx\n",
  1653. X        err, errno, RExpect, ptv
  1654. X        );
  1655. X
  1656. X    if (RTimedout) {
  1657. X        RTimedout = 0;
  1658. X        do_rto();
  1659. X    }
  1660. X    if (WTimedout) {
  1661. X        WTimedout = 0;
  1662. X        Wto_act = 0;
  1663. X        do_wto();
  1664. X    }
  1665. X    if (err < 0) {
  1666. X        if (errno == EBADF) {
  1667. X        perror("select");
  1668. X        dneterror(NULL);
  1669. X        }
  1670. X    } else {
  1671. X        register short i;
  1672. X        register short j;
  1673. X        register long mask;
  1674. X
  1675. X        for (i = 0; i < FD_SETSIZE/NFDBITS; ++i) {
  1676. X        if (mask = fd_ex.fds_bits[i]) {
  1677. X            for (j = i * NFDBITS; mask; (mask >>= 1),(++j)) {
  1678. X            if (mask & 1)
  1679. X                (*Fdstate[j])(2,j);
  1680. X            }
  1681. X        }
  1682. X        if (mask = fd_wr.fds_bits[i]) {
  1683. X            for (j = i * NFDBITS; mask; (mask >>= 1),(++j)) {
  1684. X            if (mask & 1)
  1685. X                (*Fdstate[j])(1,j);
  1686. X            }
  1687. X        }
  1688. X        if (mask = fd_rd.fds_bits[i]) {
  1689. X            for (j = i * NFDBITS; mask; (mask >>= 1),(++j)) {
  1690. X            if (mask & 1)
  1691. X                (*Fdstate[j])(0,j);
  1692. X            }
  1693. X        }
  1694. X        }
  1695. X    }
  1696. X    if (RcvData)
  1697. X        do_rnet();
  1698. X    do_wupdate();
  1699. X    }
  1700. X    dneterror(NULL);
  1701. X}
  1702. X
  1703. Xvoid
  1704. Xnop()
  1705. X{
  1706. X}
  1707. X
  1708. Xdo_netreset()
  1709. X{
  1710. X    register short i;
  1711. X    register CHAN *ch;
  1712. X    for (i = 0; i < FD_SETSIZE; ++i) {
  1713. X    if (!Fdperm[i])
  1714. X        Fdstate[i] = nop;
  1715. X    }
  1716. X    for (i = 0, ch = Chan; i < MAXCHAN; ++i, ++ch) {
  1717. X    switch(ch->state) {
  1718. X    case CHAN_OPEN:
  1719. X    case CHAN_LOPEN:    /*  pending on network        */
  1720. X    case CHAN_CLOSE:
  1721. X        if (ch->fd >= 0) {
  1722. X        FD_CLR(ch->fd, &Fdread);
  1723. X        FD_CLR(ch->fd, &Fdexcept);
  1724. X        Fdstate[ch->fd] = nop;
  1725. X        close(ch->fd);
  1726. X        ch->fd = -1;
  1727. X        ch->state = CHAN_FREE;
  1728. X        ch->flags = 0;
  1729. X        --NumCon;
  1730. X        }
  1731. X        ClearChan(&TxList, i, 1);
  1732. X        break;
  1733. X    }
  1734. X    }
  1735. X    RPStart = 0;
  1736. X    WPStart = 0;
  1737. X    WPUsed  = 0;
  1738. X    RState  = 0;
  1739. X    RChan = 0;
  1740. X    WChan = 0;
  1741. X}
  1742. X
  1743. Xdo_restart()
  1744. X{
  1745. X    WriteRestart();
  1746. X    Restart = 1;
  1747. X}
  1748. X
  1749. Xsetlistenport(remotehost)
  1750. Xchar *remotehost;
  1751. X{
  1752. X    static struct sockaddr_un sa;
  1753. X    int s;
  1754. X    extern void do_localopen();
  1755. X
  1756. X    if (DNet_fd >= 0) {
  1757. X    unlink(sa.sun_path);
  1758. X    Fdstate[DNet_fd] = nop;
  1759. X    Fdperm[DNet_fd] = 0;
  1760. X    FD_CLR(DNet_fd, &Fdread);
  1761. X    FD_CLR(DNet_fd, &Fdexcept);
  1762. X    close(DNet_fd);
  1763. X    }
  1764. X    setenv("DNETHOST=", remotehost);
  1765. X    sprintf(sa.sun_path, "DNET.%s", remotehost);
  1766. X    unlink(sa.sun_path);
  1767. X    sa.sun_family = AF_UNIX;
  1768. X
  1769. X    s = socket(PF_UNIX, SOCK_STREAM, 0);
  1770. X    /* fcntl(s, F_SETOWN, getpid()); */
  1771. X    fcntl(s, F_SETFL,  FNDELAY);
  1772. X    if (bind(s, &sa, sizeof(sa.sun_family) + strlen(sa.sun_path)) < 0) {
  1773. X    perror("bind");
  1774. X    exit(1);
  1775. X    }
  1776. X    if (listen(s, 5) < 0) {
  1777. X    unlink(sa.sun_path);
  1778. X    perror("listen");
  1779. X    exit(1);
  1780. X    }
  1781. X    DNet_fd = s;
  1782. X    Fdstate[DNet_fd] = do_localopen;
  1783. X    Fdperm[DNet_fd] = 1;
  1784. X    FD_SET(DNet_fd, &Fdread);
  1785. X    FD_SET(DNet_fd, &Fdexcept);
  1786. X}
  1787. X
  1788. END_OF_FILE
  1789. if test 7795 -ne `wc -c <'unix/dnet/dnet.c'`; then
  1790.     echo shar: \"'unix/dnet/dnet.c'\" unpacked with wrong size!
  1791. fi
  1792. # end of 'unix/dnet/dnet.c'
  1793. fi
  1794. if test -f 'unix/dnet/dnet.h' -a "${1}" != "-c" ; then 
  1795.   echo shar: Will not clobber existing file \"'unix/dnet/dnet.h'\"
  1796. else
  1797. echo shar: Extracting \"'unix/dnet/dnet.h'\" \(6529 characters\)
  1798. sed "s/^X//" >'unix/dnet/dnet.h' <<'END_OF_FILE'
  1799. X
  1800. X/*
  1801. X *  DNET.H
  1802. X *
  1803. X *    DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved
  1804. X */
  1805. X
  1806. X#include <sys/types.h>
  1807. X#include <sys/ioctl.h>
  1808. X#include <sys/socket.h>
  1809. X#include <sys/time.h>
  1810. X#include <sys/file.h>
  1811. X
  1812. X/* V2.01 */
  1813. X#include <sys/param.h>
  1814. X#include <pwd.h>
  1815. X
  1816. X#include <signal.h>
  1817. X#include <stdio.h>
  1818. X#include <errno.h>
  1819. X#ifndef FD_SETSIZE
  1820. X#define FD_SETSIZE (sizeof(struct fd_set) * 8)
  1821. X#endif
  1822. X#ifndef NFDBITS
  1823. X#define NFDBITS 32
  1824. X#define    FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
  1825. X#define    FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
  1826. X#define    FD_ISSET(n, p)    ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
  1827. X#define FD_ZERO(p)    bzero((char *)(p), sizeof(*(p)))
  1828. X#endif
  1829. X#ifndef sigmask
  1830. X#define sigmask(m) (1 << ((m)-1))
  1831. X#endif
  1832. X
  1833. X#ifndef LASTTRYDNETSERVERS
  1834. X#define LASTTRYDNETSERVERS "/usr/local/lib/dnet/dnet.servers"
  1835. X#endif
  1836. X
  1837. Xstruct Node {
  1838. X    struct Node *ln_Succ;
  1839. X    struct Node *ln_Pred;
  1840. X};
  1841. X
  1842. Xstruct List {
  1843. X    struct Node *lh_Head;
  1844. X    struct Node *lh_Tail;
  1845. X    struct Node *lh_TailPred;
  1846. X};
  1847. X
  1848. X
  1849. Xtypedef unsigned char    ubyte;
  1850. Xtypedef unsigned short    uword;
  1851. Xtypedef unsigned long    ulong;
  1852. X
  1853. Xtypedef struct List        LIST;
  1854. Xtypedef struct Node        NODE;
  1855. X
  1856. X#include "channel.h"
  1857. X
  1858. X#define PKT struct _PKT
  1859. X#define CTLPKT struct _CTLPKT
  1860. X#define XIOR struct _XIOR
  1861. X
  1862. X#define EMPTY    0    /*  empty (sent)                    */
  1863. X#define READY    1    /*  data ready (not sent yet)       */
  1864. X#define RCVBUF  4096
  1865. X
  1866. X#define MAXCHAN 128    /*  Max # of channels supported     */
  1867. X#define SYNC    0x5B    /*  SYNC character            */
  1868. X#define WTIME    8     /*  in seconds (expect ack)           */
  1869. X#define RTIME    4    /*  in seconds (read to)              */
  1870. X#define MAXPKT    200    /*  maximum packet size  (data area)              */
  1871. X#define MINPKT  32    /*  minimum packet size  (data area) for purposes */
  1872. X            /*  of determining the dynamic maximum packet size*/
  1873. X            /*  only.  Actual minimum is, of course, 1 byte   */
  1874. X
  1875. X#define MAXPACKET ((MAXPKT * 8 + 5) / 6 + 64)
  1876. X
  1877. X#define OVERHEAD    7    /*  for packets with data        */
  1878. X
  1879. XXIOR {
  1880. X    NODE    io_Node;
  1881. X    ubyte   *io_Data;
  1882. X    ulong   io_Length;
  1883. X    ulong   io_Actual;
  1884. X    uword   io_Channel;
  1885. X    ubyte   io_Command;
  1886. X    ubyte   io_Error;
  1887. X    char    io_Pri;
  1888. X};
  1889. X
  1890. XPKT {
  1891. X    uword   buflen;
  1892. X    ubyte   state;    /*  EMPTY, READY                    */
  1893. X
  1894. X    ubyte   sync;    /*  THE PACKET        */
  1895. X    ubyte   ctl;
  1896. X    ubyte   cchk;
  1897. X    ubyte   lenh;
  1898. X    ubyte   lenl;
  1899. X    ubyte   dchkh;
  1900. X    ubyte   dchkl;
  1901. X    ubyte   data[MAXPACKET];
  1902. X};
  1903. X
  1904. XCTLPKT {
  1905. X    uword buflen;
  1906. X    ubyte state;
  1907. X
  1908. X    ubyte sync;
  1909. X    ubyte ctl;
  1910. X    ubyte cchk;
  1911. X};
  1912. X
  1913. X    /*
  1914. X     *    In receiving a packet the receiver can be in one of these
  1915. X     *    states.
  1916. X     */
  1917. X
  1918. X#define RS_SYNC 0        /*    Waiting for sync        */
  1919. X#define RS_CTL    1        /*    Waiting for command        */
  1920. X#define RS_CCHK 2        /*    Waiting for check byte        */
  1921. X#define RS_LEN1 3        /*    Waiting for MSB length byte    */
  1922. X#define RS_LEN2 4        /*    Waiting for LSB length byte    */
  1923. X#define RS_DATA 5        /*    Waiting for data & checksum    */
  1924. X
  1925. X    /*
  1926. X     *    The low level protocol generates packets.   This is used 
  1927. X     *    for error checking, data sequencing, retries, restart, etc...
  1928. X     *    The packet format is:
  1929. X     *
  1930. X     *    SYNC sss0xccc CHK
  1931. X     *    SYNC sss1xccc CHK nnnnnnnn nnnnnnnn [DATA] CHK2
  1932. X     *                msb       lsb
  1933. X     *
  1934. X     *    sss = sequence #
  1935. X     *    B4  = packet contains data
  1936. X     *    B3  = reserved (may be used to extend the command set)
  1937. X     *    ccc = PKF_?????
  1938. X     *
  1939. X     *    NOTE that the data length nnn..nn is not checked with either
  1940. X     *    CHK or CHK2 .  The protocol will determine if the length
  1941. X     *    is reasonable (< MAXPKT) and then try to read that many
  1942. X     *    bytes.  The CHK will obviously fail if the length was 
  1943. X     *    incorrect.
  1944. X     */
  1945. X
  1946. X#define PKF_SEQUENCE    0x07    /*  Sequence #            */
  1947. X#define PKF_MASK    0x78    /*  command mask        */
  1948. X
  1949. X#define PKCMD_RESTART     0x20    /*  RESTART dnet.  (new)    */
  1950. X#define PKCMD_ACKRSTART    0x28    /*  ACK a restart  (new)    */
  1951. X#define PKCMD_WRITE6    0x30
  1952. X#define PKCMD_WRITE    0x38    /*  A DATA packet        */
  1953. X#define PKCMD_CHECK    0x40    /*  Request ACK or NAK for win    */
  1954. X#define PKCMD_ACK    0x48    /*  ACK a window        */
  1955. X#define PKCMD_NAK    0x50    /*  NAK a window        */
  1956. X#define PKCMD_WRITE7    0x58
  1957. X
  1958. X    /*
  1959. X     *  All channel multiplexing, channel commands, etc... is encoded
  1960. X     *  within a PKCMD_WRITE packet.
  1961. X     *
  1962. X     *  Channel commands are characterized by a one byte control
  1963. X     *  field and up to 7 bytes of data.  The control field format
  1964. X     *  is:        10cccnnn [DATA]        ccc = SCMD_??
  1965. X     *                    nnn = # additional data bytes
  1966. X     */
  1967. X
  1968. X#define SCMD_SWITCH    0x00    /*  switch active channel #    */
  1969. X#define SCMD_OPEN    0x01    /*  open a channel        */
  1970. X#define SCMD_CLOSE    0x02    /*  close a channel        */
  1971. X#define SCMD_ACKCMD    0x03    /*  ack an open/close request    */
  1972. X#define SCMD_EOFCMD    0x04    /*  Reof or Weof        */
  1973. X#define SCMD_QUIT    0x05    /*  QUIT dnet            */
  1974. X#define SCMD_IOCTL    0x06    /*  channel ioctl (new),PTY sup    */
  1975. X#define SCMD_RESERVE1    0x07
  1976. X
  1977. X    /*
  1978. X     *  Stream data is characterized by the following format:
  1979. X     *
  1980. X     *           msb      lsb    
  1981. X     *        11nnnnnn nnnnnnnn [128-16383 bytes DATA]
  1982. X     *             0nnnnnnn [0-127 bytes DATA]
  1983. X     *
  1984. X     *  NOTE:  11000000 0ccccccc nnnnnnnn   reserved for furture ext. of
  1985. X     *                    SCMD commands.
  1986. X     */
  1987. X
  1988. X#define SCMD_DATA    0x08    /*  stream command, DATA (dummy ID)    */
  1989. X
  1990. X    /*
  1991. X     *  Each channel can be in one of several states.
  1992. X     */
  1993. X
  1994. X#define CHAN_FREE    0x01    /*  free channel        */
  1995. X#define CHAN_ROPEN    0x02    /*  remote open, wait port msg    */
  1996. X#define CHAN_LOPEN    0x03    /*  local open, wait reply    */
  1997. X#define CHAN_OPEN    0x04    /*  channel open        */
  1998. X#define CHAN_CLOSE    0x05    /*  one side of channel closed  */
  1999. X
  2000. X#define CHANF_ROK    0x01    /*  remote hasn't EOF'd us yet  */
  2001. X#define CHANF_WOK    0x02    /*  remote will accept data    */
  2002. X#define CHANF_LCLOSE    0x04     /*  channel closed on our side  */
  2003. X#define CHANF_RCLOSE    0x08    /*  channel closed on rem side  */
  2004. X
  2005. Xextern ubyte *RemHead();
  2006. Xextern ubyte *malloc();
  2007. Xextern char *getenv();
  2008. X
  2009. X#ifndef NOEXT
  2010. Xextern int DNet_fd;
  2011. Xextern PKT Pkts[9];
  2012. Xextern PKT *RPak[4];
  2013. Xextern PKT *WPak[4];
  2014. Xextern CHAN Chan[MAXCHAN];
  2015. Xextern LIST TxList;           /*  For pending DNCMD_WRITE reqs.   */
  2016. Xextern fd_set Fdread;
  2017. Xextern fd_set Fdwrite;
  2018. Xextern fd_set Fdexcept;
  2019. Xextern void (*Fdstate[FD_SETSIZE])();
  2020. Xextern ubyte Fdperm[FD_SETSIZE];
  2021. Xextern uword FdChan[FD_SETSIZE];
  2022. Xextern ubyte RcvBuf[RCVBUF];
  2023. Xextern ubyte RTimedout, WTimedout;
  2024. Xextern uword Rto_act, Wto_act;
  2025. Xextern uword RcvData;
  2026. Xextern uword RExpect;
  2027. Xextern uword RChan;
  2028. Xextern uword WChan;
  2029. Xextern uword RPStart;
  2030. Xextern uword WPStart;
  2031. Xextern uword WPUsed;
  2032. Xextern uword RState;
  2033. Xextern ubyte DDebug;
  2034. Xextern ubyte PDebug;
  2035. Xextern ubyte Restart;
  2036. Xextern ubyte DeldQuit;
  2037. Xextern ulong NumCon; 
  2038. Xextern ubyte Mode7;
  2039. X
  2040. Xextern int errno;
  2041. Xextern int WReady;
  2042. X
  2043. X#endif
  2044. X
  2045. END_OF_FILE
  2046. if test 6529 -ne `wc -c <'unix/dnet/dnet.h'`; then
  2047.     echo shar: \"'unix/dnet/dnet.h'\" unpacked with wrong size!
  2048. fi
  2049. # end of 'unix/dnet/dnet.h'
  2050. fi
  2051. if test -f 'unix/dnet/packet.c' -a "${1}" != "-c" ; then 
  2052.   echo shar: Will not clobber existing file \"'unix/dnet/packet.c'\"
  2053. else
  2054. echo shar: Extracting \"'unix/dnet/packet.c'\" \(6388 characters\)
  2055. sed "s/^X//" >'unix/dnet/packet.c' <<'END_OF_FILE'
  2056. X
  2057. X/*
  2058. X *  PACKET.C
  2059. X */
  2060. X
  2061. X#include "dnet.h"
  2062. X
  2063. Xvoid BuildPacket();
  2064. X
  2065. X#define Ascize(foo) (((foo) & 0x3F) | 0x40)
  2066. X
  2067. Xubyte    RxTmp[MAXPACKET];
  2068. X
  2069. Xvoid
  2070. XBuildDataPacket(pkt, win, dbuf, actlen)
  2071. XPKT    *pkt;
  2072. Xubyte    win;
  2073. Xubyte    *dbuf;
  2074. Xuword    actlen;
  2075. X{
  2076. X    ubyte *ptr;
  2077. X    ubyte *pend;
  2078. X    ubyte range = 0;
  2079. X    static ubyte BadCtl[32] = {
  2080. X    1, 1, 1, 1, 1, 1, 1, 1,
  2081. X    1, 1, 1, 1, 1, 1, 1, 1,
  2082. X    1, 1, 1, 1, 1, 1, 1, 1,
  2083. X    1, 1, 1, 1, 1, 1, 1, 1
  2084. X    };
  2085. X
  2086. X    ptr = dbuf;
  2087. X    pend= dbuf + actlen;
  2088. X
  2089. X    while (ptr < pend) {
  2090. X    if (*ptr < 0x20 && BadCtl[*ptr])
  2091. X        range |= 1;
  2092. X    if (*ptr >= 0x80)
  2093. X        range |= 2;
  2094. X    ++ptr;
  2095. X    }
  2096. X    if (Mode7 && range) {
  2097. X    uword buflen = Expand6(dbuf, pkt->data, actlen);
  2098. X    BuildPacket(pkt, PKCMD_WRITE6, win, pkt->data, actlen, buflen);
  2099. X    } else {
  2100. X    if (Mode7 || (range & 2)) {
  2101. X        BuildPacket(pkt, PKCMD_WRITE, win, dbuf, actlen, actlen);
  2102. X    } else {
  2103. X        uword buflen = Compress7(dbuf, pkt->data, actlen);
  2104. X        BuildPacket(pkt, PKCMD_WRITE7, win, pkt->data, actlen, buflen);
  2105. X    }
  2106. X    }
  2107. X}
  2108. X
  2109. XPKT *
  2110. XBuildRestartAckPacket(dbuf, bytes)
  2111. Xubyte *dbuf;
  2112. Xubyte bytes;
  2113. X{
  2114. X    static PKT pkt;
  2115. X    BuildPacket(&pkt, PKCMD_ACKRSTART, 0, dbuf, bytes, bytes);
  2116. X    return(&pkt);
  2117. X}
  2118. X
  2119. Xvoid
  2120. XBuildPacket(pkt, ctl, win, dbuf, actlen, buflen)
  2121. XPKT    *pkt;
  2122. Xubyte    ctl;
  2123. Xubyte    *dbuf;
  2124. Xuword    actlen;
  2125. Xuword    buflen;
  2126. X{
  2127. X    pkt->buflen = buflen;
  2128. X    pkt->sync = SYNC;
  2129. X    pkt->ctl = ctl | win;
  2130. X    pkt->cchk = Ascize((pkt->sync << 1) ^ pkt->ctl);
  2131. X    if (actlen) {
  2132. X    uword chk = chkbuf(dbuf, buflen);
  2133. X    ubyte dchkh = chk >> 8;
  2134. X    ubyte dchkl = chk;
  2135. X
  2136. X    pkt->lenh = Ascize(actlen >> 6);
  2137. X    pkt->lenl = Ascize(actlen);
  2138. X    pkt->dchkh= Ascize(dchkh);
  2139. X    pkt->dchkl= Ascize(dchkl);
  2140. X    if (dbuf != pkt->data)
  2141. X        bcopy(dbuf, pkt->data, buflen);
  2142. X    }
  2143. X}
  2144. X
  2145. Xvoid
  2146. XWritePacket(pkt)
  2147. XPKT *pkt;
  2148. X{
  2149. X    if (DDebug)
  2150. X    printf("SEND-PACKET %02x %d\n", pkt->ctl, pkt->buflen);
  2151. X
  2152. X    if (pkt->buflen)
  2153. X    NetWrite(&pkt->sync, 7 + pkt->buflen);
  2154. X    else
  2155. X    NetWrite(&pkt->sync, 3);
  2156. X    switch(pkt->ctl) {
  2157. X    case PKCMD_WRITE:
  2158. X    case PKCMD_WRITE6:
  2159. X    case PKCMD_WRITE7:
  2160. X    case PKCMD_RESTART:
  2161. X    WTimeout(WTIME);
  2162. X    }
  2163. X}
  2164. X
  2165. Xvoid
  2166. XWriteCtlPacket(ctl, win)
  2167. X{
  2168. X    static CTLPKT pkt;
  2169. X
  2170. X    NetWrite(NULL, 0);
  2171. X    BuildPacket(&pkt, ctl, win, NULL, 0, 0);
  2172. X    WritePacket(&pkt);
  2173. X}
  2174. X
  2175. Xvoid
  2176. XWriteNak(win)
  2177. X{
  2178. X    WriteCtlPacket(PKCMD_NAK, win);
  2179. X}
  2180. X
  2181. Xvoid
  2182. XWriteAck(win)
  2183. X{
  2184. X    WriteCtlPacket(PKCMD_ACK, win);
  2185. X}
  2186. X
  2187. Xvoid
  2188. XWriteChk(win)
  2189. X{
  2190. X    WriteCtlPacket(PKCMD_CHECK, win);
  2191. X}
  2192. X
  2193. Xvoid
  2194. XWriteRestart()
  2195. X{
  2196. X    WriteCtlPacket(PKCMD_RESTART, 0);
  2197. X}
  2198. X
  2199. X/*
  2200. X *    RECEIVE A PACKET
  2201. X */
  2202. X
  2203. Xint
  2204. XRecvPacket(ptr, len)
  2205. Xubyte *ptr;
  2206. Xlong len;
  2207. X{
  2208. X    static uword ActLen;    /*    actual # bytes after decoding */
  2209. X    static uword BufLen;    /*    length of input data buffer   */
  2210. X    static uword DBLen;     /*    # bytes already in i.d.buf    */
  2211. X    static ubyte RState;
  2212. X    static PKT     Pkt;
  2213. X    ubyte  *dptr;
  2214. X    short expect;
  2215. X
  2216. X    if (ptr == NULL) {
  2217. X    RState = 0;
  2218. X    return(3);
  2219. X    }
  2220. X
  2221. X    while (len) {
  2222. X    switch(RState) {
  2223. X    case 0:
  2224. X        --len;
  2225. X        Pkt.sync = *ptr++;
  2226. X
  2227. X        if (Pkt.sync == SYNC)
  2228. X        ++RState;
  2229. X        break;
  2230. X    case 1:     /*  CTL */
  2231. X        --len;
  2232. X        Pkt.ctl = *ptr++;
  2233. X
  2234. X        if (Pkt.ctl < 0x20 || Pkt.ctl > 0x7F) {
  2235. X        RState = 0;
  2236. X        break;
  2237. X        }
  2238. X        ++RState;
  2239. X        break;
  2240. X    case 2:     /*  CCHK    */
  2241. X        --len;
  2242. X        Pkt.cchk = *ptr++;
  2243. X
  2244. X        if (Ascize((SYNC<<1) ^ Pkt.ctl) != Pkt.cchk) {
  2245. X        RState = 0;
  2246. X        break;
  2247. X        }
  2248. X        switch(Pkt.ctl & PKF_MASK) {
  2249. X        case PKCMD_ACKRSTART:
  2250. X        case PKCMD_WRITE:
  2251. X        case PKCMD_WRITE6:
  2252. X        case PKCMD_WRITE7:
  2253. X        if (DDebug)
  2254. X            printf("Recv Header %02x\n", Pkt.ctl & PKF_MASK);
  2255. X        ++RState;
  2256. X        break;
  2257. X        default:
  2258. X        if (DDebug)
  2259. X            printf("Recv Control %02x\n", Pkt.ctl & PKF_MASK);
  2260. X        do_cmd(Pkt.ctl, NULL, 0);
  2261. X        RState = 0;
  2262. X        break;
  2263. X        }
  2264. X        break;
  2265. X    case 3:     /*  LENH    */
  2266. X        --len;
  2267. X        Pkt.lenh = *ptr++;
  2268. X
  2269. X        ++RState;
  2270. X        if (Pkt.lenh < 0x20 || Pkt.lenh > 0x7F)
  2271. X        RState = 0;
  2272. X        break;
  2273. X    case 4:     /*  LENL    */
  2274. X        --len;
  2275. X        Pkt.lenl = *ptr++;
  2276. X
  2277. X        if (Pkt.lenl < 0x20 || Pkt.lenl > 0x7F) {
  2278. X        RState = 0;
  2279. X        break;
  2280. X        }
  2281. X
  2282. X        ++RState;
  2283. X
  2284. X        ActLen = ((Pkt.lenh & 0x3F) << 6) | (Pkt.lenl & 0x3F);
  2285. X        DBLen = 0;
  2286. X
  2287. X        switch(Pkt.ctl & PKF_MASK) {
  2288. X        case PKCMD_ACKRSTART:
  2289. X        case PKCMD_WRITE:
  2290. X        BufLen = ActLen;
  2291. X        break;
  2292. X        case PKCMD_WRITE6:
  2293. X        BufLen = (ActLen * 8 + 5) / 6;
  2294. X        break;
  2295. X        case PKCMD_WRITE7:
  2296. X        BufLen = (ActLen * 7 + 7) / 8;
  2297. X        break;
  2298. X        default:
  2299. X        puts("BaD");
  2300. X        break;
  2301. X        }
  2302. X
  2303. X        if (ActLen > MAXPKT || BufLen > MAXPACKET) {
  2304. X        if (DDebug || DDebug)
  2305. X            printf("Packet Length Error %d %d\n", ActLen, BufLen);
  2306. X        RState = 0;
  2307. X        }
  2308. X        break;
  2309. X    case 5:     /*  DChkH   */
  2310. X        --len;
  2311. X        Pkt.dchkh = *ptr++;
  2312. X
  2313. X        ++RState;
  2314. X        if (Pkt.dchkh < 0x20 || Pkt.dchkh > 0x7F)
  2315. X        RState = 0;
  2316. X        break;
  2317. X    case 6:     /*  DCHKL   */
  2318. X        --len;
  2319. X        Pkt.dchkl = *ptr++;
  2320. X
  2321. X        ++RState;
  2322. X        if (Pkt.dchkl < 0x20 || Pkt.dchkl > 0x7F)
  2323. X        RState = 0;
  2324. X        break;
  2325. X    case 7:     /*  -DATA-  */
  2326. X        if (DBLen + len < BufLen) {     /*  not enough  */
  2327. X        bcopy(ptr, Pkt.data + DBLen, len);
  2328. X        DBLen += len;
  2329. X        len = 0;
  2330. X        break;
  2331. X        }
  2332. X
  2333. X        /*
  2334. X         *    Enough data, check chk
  2335. X         */
  2336. X
  2337. X        bcopy(ptr, Pkt.data + DBLen, BufLen - DBLen);
  2338. X        len -= BufLen - DBLen;
  2339. X        ptr += BufLen - DBLen;
  2340. X
  2341. X        {
  2342. X        uword chk;
  2343. X        ubyte chkh;
  2344. X        ubyte chkl;
  2345. X
  2346. X        chk = chkbuf(Pkt.data, BufLen);
  2347. X        chkh = Ascize(chk >> 8);
  2348. X        chkl = Ascize(chk);
  2349. X
  2350. X        if (Pkt.dchkh != chkh || Pkt.dchkl != chkl) {
  2351. X            printf("Chksum failure %02x %02x %02x %02x\n",
  2352. X            Pkt.dchkh, chkh, Pkt.dchkl, chkl
  2353. X            );
  2354. X            RState = 0;
  2355. X            break;
  2356. X        }
  2357. X        }
  2358. X
  2359. X        switch(Pkt.ctl & PKF_MASK) {
  2360. X        case PKCMD_ACKRSTART:
  2361. X        dptr = Pkt.data;
  2362. X        break;
  2363. X        case PKCMD_WRITE:
  2364. X        dptr = Pkt.data;
  2365. X        break;
  2366. X        case PKCMD_WRITE6:
  2367. X        UnExpand6(Pkt.data, RxTmp, ActLen);
  2368. X        dptr = RxTmp;
  2369. X        break;
  2370. X        case PKCMD_WRITE7:
  2371. X        UnCompress7(Pkt.data, RxTmp, ActLen);
  2372. X        dptr = RxTmp;
  2373. X        break;
  2374. X        default:
  2375. X        puts("BaD2");
  2376. X        dptr = Pkt.data;
  2377. X        break;
  2378. X        }
  2379. X        if (DDebug)
  2380. X        printf("Recv Body   %02x %ld bytes\n", Pkt.ctl, ActLen);
  2381. X
  2382. X        do_cmd(Pkt.ctl, dptr, ActLen);
  2383. X
  2384. X        RState = 0;
  2385. X        break;
  2386. X    }
  2387. X    }
  2388. X
  2389. X    {
  2390. X    static short ExpAry[] = { 3, 2, 1, 4, 3, 2, 1, 0 };
  2391. X
  2392. X    expect = ExpAry[RState];
  2393. X
  2394. X    if (RState == 7)
  2395. X        expect = BufLen - DBLen;
  2396. X    }
  2397. X#ifdef NOTDEF
  2398. X    if (Rto_act) {
  2399. X    AbortIO((IOR *)&Rto);
  2400. X    WaitIO((IOR *)&Rto);
  2401. X    Rto_act = 0;
  2402. X    }
  2403. X    if (RState == 7) {
  2404. X    Rto.tr_time.tv_secs = 8;
  2405. X    Rto.tr_time.tv_micro= 0;
  2406. X    SendIO((IOR *)&Rto);
  2407. X    Rto_act = 1;
  2408. X    }
  2409. X#endif
  2410. X    do_cmd((uword)-1, NULL, 0);
  2411. X    return((int)expect);
  2412. X}
  2413. X
  2414. END_OF_FILE
  2415. if test 6388 -ne `wc -c <'unix/dnet/packet.c'`; then
  2416.     echo shar: \"'unix/dnet/packet.c'\" unpacked with wrong size!
  2417. fi
  2418. # end of 'unix/dnet/packet.c'
  2419. fi
  2420. if test -f 'unix/lib/dnetlib.c' -a "${1}" != "-c" ; then 
  2421.   echo shar: Will not clobber existing file \"'unix/lib/dnetlib.c'\"
  2422. else
  2423. echo shar: Extracting \"'unix/lib/dnetlib.c'\" \(6103 characters\)
  2424. sed "s/^X//" >'unix/lib/dnetlib.c' <<'END_OF_FILE'
  2425. X
  2426. X/*
  2427. X *  DNETLIB.C
  2428. X *
  2429. X *    DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved
  2430. X *
  2431. X *  Library Interface for DNET.
  2432. X */
  2433. X
  2434. X#include <sys/types.h>
  2435. X#include <sys/socket.h>
  2436. X#include <fcntl.h>
  2437. X#include <signal.h>
  2438. X#include <stdio.h>
  2439. X#include <errno.h>
  2440. X#ifdef O_CREAT
  2441. X#include <sys/file.h>
  2442. X#endif
  2443. X#include "../lib/dnetlib.h"
  2444. X
  2445. Xextern char *getenv();
  2446. X
  2447. Xtypedef unsigned short uword;
  2448. Xtypedef unsigned long ulong;
  2449. Xtypedef unsigned char ubyte;
  2450. Xtypedef struct sockaddr SOCKADDR;
  2451. X
  2452. Xtypedef struct {
  2453. X    int s;
  2454. X    uword port;
  2455. X} CHANN;
  2456. X
  2457. X#define NAMELEN sizeof(".PORT.XXXXX")
  2458. X#define NAMEPAT "%s.PORT.%ld"
  2459. X
  2460. Xchar *getdirpart();
  2461. X
  2462. XCHANN *
  2463. XDListen(port)
  2464. Xuword port;
  2465. X{
  2466. X    CHANN *chan;
  2467. X    int s;
  2468. X    SOCKADDR *sa = (SOCKADDR *)malloc(sizeof(SOCKADDR)+256);
  2469. X    char *dirstr = getenv("DNETDIR") ? getenv("DNETDIR") : "";
  2470. X
  2471. X    sprintf(sa->sa_data, NAMEPAT, dirstr, port);
  2472. X    sa->sa_family = AF_UNIX;
  2473. X    unlink(sa->sa_data);
  2474. X
  2475. X    s = socket(PF_UNIX, SOCK_STREAM, 0);
  2476. X    fcntl(s, F_SETOWN, getpid());
  2477. X    if (bind(s, sa, sizeof(*sa)-sizeof(sa->sa_data)+strlen(sa->sa_data)) < 0) {
  2478. X    close(s);
  2479. X    free(sa);
  2480. X    return(NULL);
  2481. X    }
  2482. X    if (listen(s, 5) < 0) {
  2483. X    close(s);
  2484. X    unlink(sa->sa_data);
  2485. X    free(sa);
  2486. X    return(NULL);
  2487. X    }
  2488. X    chan = (CHANN *)malloc(sizeof(CHANN));
  2489. X    chan->s = s;
  2490. X    chan->port = port;
  2491. X    free(sa);
  2492. X    return(chan);
  2493. X}
  2494. X
  2495. X
  2496. XDUnListen(chan)
  2497. XCHANN *chan;
  2498. X{
  2499. X    char *dirstr = getenv("DNETDIR") ? getenv("DNETDIR") : "";
  2500. X    char buf[32];
  2501. X
  2502. X    close(chan->s);
  2503. X    sprintf(buf, NAMEPAT, dirstr, chan->port);
  2504. X    unlink(buf);
  2505. X    free(chan);
  2506. X}
  2507. X
  2508. XDAccept(chan)
  2509. XCHANN *chan;
  2510. X{
  2511. X    SOCKADDR sa;
  2512. X    int addrlen = sizeof(sa);
  2513. X    int fd;
  2514. X
  2515. X    fd = accept(chan->s, &sa, &addrlen);
  2516. X    return(fd);
  2517. X}
  2518. X
  2519. XDOpen(host, port, txpri, rxpri)
  2520. Xchar *host;
  2521. Xuword port;
  2522. Xchar txpri, rxpri;
  2523. X{
  2524. X    int s;
  2525. X    char rc;
  2526. X    short xb[3];
  2527. X    SOCKADDR *sa = (SOCKADDR *)malloc(sizeof(SOCKADDR)+256);
  2528. X    char *dirstr = getenv("DNETDIR") ? getenv("DNETDIR") : "";
  2529. X
  2530. X    if (rxpri < -127)
  2531. X    rxpri = -127;
  2532. X    if (rxpri > 126)
  2533. X    rxpri = 126;
  2534. X    if (txpri < -127)
  2535. X    txpri = -127;
  2536. X    if (txpri > 126)
  2537. X    txpri = 126;
  2538. X
  2539. X    if (host == NULL)
  2540. X    host = (getenv("DNETHOST")) ? getenv("DNETHOST"):"3";
  2541. X
  2542. X    sa->sa_family = AF_UNIX;
  2543. X    sprintf(sa->sa_data, "%s%s%s", dirstr, "DNET.", host);
  2544. X
  2545. X    s = socket(PF_UNIX, SOCK_STREAM, 0);
  2546. X    fcntl(s, F_SETOWN, getpid());
  2547. X    if (connect(s, sa, sizeof(sa->sa_family) + strlen(sa->sa_data)) < 0) {
  2548. X    close(s);
  2549. X    free(sa);
  2550. X    return(-1);
  2551. X    }
  2552. X    free(sa);
  2553. X    xb[0] = port;
  2554. X    ((char *)&xb[1])[0] = txpri;
  2555. X    ((char *)&xb[1])[1] = rxpri;
  2556. X    write(s, xb, 4);
  2557. X    if (read(s, &rc, 1) == 1 && rc == 0)
  2558. X    return(s);
  2559. X    close(s);
  2560. X    return(-1);
  2561. X}
  2562. X
  2563. XDEof(fd)
  2564. X{
  2565. X    char dummy;
  2566. X
  2567. X    shutdown(fd, 1);
  2568. X    write(fd, &dummy, 0);
  2569. X}
  2570. X
  2571. Xgwrite(fd, buf, bytes)
  2572. Xchar *buf;
  2573. X{
  2574. X    int n;
  2575. X    int orig = bytes;
  2576. X    extern int errno;
  2577. X    while (bytes) {
  2578. X    n = write(fd, buf, bytes);
  2579. X    if (n > 0) {
  2580. X        bytes -= n;
  2581. X        buf += n;
  2582. X        continue;
  2583. X    }
  2584. X    if (n < 0) {
  2585. X        if (errno == EINTR)
  2586. X        continue;
  2587. X        if (errno == EWOULDBLOCK) {
  2588. X        int wm = 1 << fd;
  2589. X        int em = 1 << fd;
  2590. X        if (select(fd+1, NULL, &wm, &em, NULL) < 0)
  2591. X            continue;
  2592. X        if (wm)
  2593. X            continue;
  2594. X        }
  2595. X        return(orig - bytes);
  2596. X    }
  2597. X    }
  2598. X    return(orig);
  2599. X}
  2600. X
  2601. Xgread(fd, buf, bytes)
  2602. Xchar *buf;
  2603. X{
  2604. X    int n;
  2605. X    int orig = bytes;
  2606. X    extern int errno;
  2607. X    while (bytes) {
  2608. X    n = read(fd, buf, bytes);
  2609. X    if (n > 0) {
  2610. X        bytes -= n;
  2611. X        buf += n;
  2612. X        break;
  2613. X    }
  2614. X    if (n < 0) {
  2615. X        if (errno == EINTR)
  2616. X        continue;
  2617. X        if (errno == EWOULDBLOCK) {
  2618. X        int rm = 1 << fd;
  2619. X        int em = 1 << fd;
  2620. X        if (select(fd+1, &rm, NULL, &em, NULL) < 0)
  2621. X            continue;
  2622. X        if (rm)
  2623. X            continue;
  2624. X        }
  2625. X        return(orig - bytes);
  2626. X    }
  2627. X    if (n == 0)
  2628. X        break;
  2629. X    }
  2630. X    return(orig - bytes);
  2631. X}
  2632. X
  2633. Xggread(fd, buf, bytes)
  2634. Xchar *buf;
  2635. X{
  2636. X    int n;
  2637. X    int ttl = 0;
  2638. X    while (bytes) {
  2639. X    n = gread(fd, buf, bytes);
  2640. X    if (n > 0) {
  2641. X        bytes -= n;
  2642. X        buf += n;
  2643. X        ttl += n;
  2644. X        continue;
  2645. X    }
  2646. X    return(-1);
  2647. X    }
  2648. X    return(ttl);
  2649. X}
  2650. X
  2651. X/*
  2652. X *    Convert to and from 68000 longword format.  Of course, it really
  2653. X *    doesn't matter what format you use, just as long as it is defined.
  2654. X */
  2655. X
  2656. Xntohl68(n)
  2657. Xulong n;
  2658. X{
  2659. X    return(
  2660. X    (((ubyte *)&n)[0] << 24)|
  2661. X    (((ubyte *)&n)[1] << 16)|
  2662. X    (((ubyte *)&n)[2] << 8)|
  2663. X    (((ubyte *)&n)[3])
  2664. X    );
  2665. X}
  2666. X
  2667. Xhtonl68(n)
  2668. Xulong n;
  2669. X{
  2670. X    ulong v;
  2671. X    ((ubyte *)&v)[0] = n >> 24;
  2672. X    ((ubyte *)&v)[1] = n >> 16;
  2673. X    ((ubyte *)&v)[2] = n >> 8;
  2674. X    ((ubyte *)&v)[3] = n;
  2675. X    return(v);
  2676. X}
  2677. X
  2678. X
  2679. XDoOption(ac, av, ops, args)
  2680. Xshort ac;
  2681. Xchar *av[];
  2682. Xchar *ops;
  2683. Xlong args;
  2684. X{
  2685. X    register short i;
  2686. X    short j;
  2687. X
  2688. X    for (i = j = 1; i < ac; ++i) {
  2689. X    register char *ptr = av[i];
  2690. X    if (*ptr != '-') {
  2691. X        av[j++] = av[i];
  2692. X        continue;
  2693. X    }
  2694. X    while (*++ptr) {
  2695. X        register char *op;
  2696. X        long **ap = (long **)&args;
  2697. X        short isshort;
  2698. X
  2699. X        for (op = ops; *op && *op != *ptr;) {
  2700. X        if (*op == *ptr)
  2701. X            break;
  2702. X        if (*++op == '%') {
  2703. X            while (*op && *op != 's' && *op != 'd')
  2704. X            ++op;
  2705. X            if (*op)
  2706. X            ++op;
  2707. X        }
  2708. X        if (*op == ',')     /*  optional ,  */
  2709. X            ++op;
  2710. X        ++ap;
  2711. X        }
  2712. X        if (*op == 0)
  2713. X        return(-1);
  2714. X        if (op[1] != '%') {
  2715. X        *(short *)*ap = 1;
  2716. X        ++ap;
  2717. X        continue;
  2718. X        }
  2719. X        op += 2;
  2720. X        isshort = 1;
  2721. X        while (*op && *op != 's' && *op != 'd') {
  2722. X        switch(*op) {
  2723. X        case 'h':
  2724. X            isshort = 1;
  2725. X            break;
  2726. X        case 'l':
  2727. X            isshort = 0;
  2728. X            break;
  2729. X        default:
  2730. X            return(-1);
  2731. X        }
  2732. X        ++op;
  2733. X        }
  2734. X        switch(*op) {
  2735. X        case 's':
  2736. X        if (ptr[1]) {
  2737. X            *(char **)*ap = ptr + 1;
  2738. X            ptr = "\0";
  2739. X        } else {
  2740. X            *(char **)*ap = av[++i];
  2741. X        }
  2742. X        break;
  2743. X        case 'd':
  2744. X        if (isshort)
  2745. X            *(short *)*ap = atoi(++ptr);
  2746. X        else
  2747. X            *(long *)*ap = atoi(++ptr);
  2748. X        while (*ptr >= '0' && *ptr <= '9')
  2749. X            ++ptr;
  2750. X        break;
  2751. X        default:
  2752. X        return(-1);
  2753. X        }
  2754. X    }
  2755. X    }
  2756. X    return(j);
  2757. X}
  2758. X
  2759. Xelog(how, ctl, arg)
  2760. Xchar *ctl;
  2761. Xlong arg;
  2762. X{
  2763. X    char *dir = getenv("DNETDIR");
  2764. X    FILE *fi;
  2765. X    char buf[256];
  2766. X    long dtime;
  2767. X
  2768. X    time(&dtime);
  2769. X
  2770. X    if (!dir)
  2771. X    dir = "";
  2772. X    sprintf(buf, "%s%s", dir, "DNET.LOG");
  2773. X    if (fi = fopen(buf, "a")) {
  2774. X    strcpy(buf, ctime(&dtime));
  2775. X    buf[strlen(buf)-1] = 0;
  2776. X    fprintf(fi, "%s ", buf);
  2777. X    fprintf(fi, ctl, arg);
  2778. X    putc('\n', fi);
  2779. X    fclose(fi);
  2780. X    }
  2781. X    if (how == EFATAL)
  2782. X    exit(1);
  2783. X}
  2784. X
  2785. END_OF_FILE
  2786. if test 6103 -ne `wc -c <'unix/lib/dnetlib.c'`; then
  2787.     echo shar: \"'unix/lib/dnetlib.c'\" unpacked with wrong size!
  2788. fi
  2789. # end of 'unix/lib/dnetlib.c'
  2790. fi
  2791. echo shar: End of archive 4 \(of 8\).
  2792. cp /dev/null ark4isdone
  2793. MISSING=""
  2794. for I in 1 2 3 4 5 6 7 8 ; do
  2795.     if test ! -f ark${I}isdone ; then
  2796.     MISSING="${MISSING} ${I}"
  2797.     fi
  2798. done
  2799. if test "${MISSING}" = "" ; then
  2800.     echo You have unpacked all 8 archives.
  2801.     rm -f ark[1-9]isdone
  2802. else
  2803.     echo You still need to unpack the following archives:
  2804.     echo "        " ${MISSING}
  2805. fi
  2806. ##  End of shell archive.
  2807. exit 0
  2808. -- 
  2809. Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
  2810. Mail comments to the moderator at <amiga-request@cs.odu.edu>.
  2811. Post requests for sources, and general discussion to comp.sys.amiga.
  2812.